UnityでJSONファイルを読み込むメモ
環境
Windows10
Unity 2019.1.1f1
やること
4パターンの入力ファイルをそれぞれ読み取る。
どのパターンでも流れは同じで以下の通り。
参考
パターン1
シンプルなやつ。
{ "aaa": "abc", "bbb": "150" }
まずはJSONの構造を表現するためにクラスを作成する。今回は入力の「"aaa": "aaa"」と「"bbb": "150"」に対応させて、string型の変数aaaとint型の変数bbbを持つInputJsonクラスを作成。(クラス名は自由、変数名は入力ファイルのものと同じにする)
[Serializable] public class InputJson { public string aaa; public int bbb; }
次に入力ファイルをテキストファイルとして読み取り、string型で受け取る。
string inputString = Resources.Load<TextAsset>("input").ToString();
最後にJsonUtility.FromJsonを用いて、先に作成したInputJsonクラスへデシリアライズ。
InputJson inputJson = JsonUtility.FromJson<InputJson>(inputString);
using System; using UnityEngine; // 入力されるJSONに合わせてクラスを作成 [Serializable] public class InputJson { public string aaa; public int bbb; } public class JsonReader : MonoBehaviour { void Start() { // 入力ファイルはAssets/Resources/input.json // input.jsonをテキストファイルとして読み取り、string型で受け取る string inputString = Resources.Load<TextAsset>("input").ToString(); // 上で作成したクラスへデシリアライズ InputJson inputJson = JsonUtility.FromJson<InputJson>(inputString); Debug.Log(inputJson.aaa); // abc Debug.Log(inputJson.bbb); // 150 } }
パターン2
ネストした要素。
{ "aaa": { "bbb": "111", "ccc": "222" } }
要素に対応したクラスを追加する。
using System; using UnityEngine; [Serializable] public class InputJson { // 追加したAAAクラスの変数aaa。変数名は入力ファイルと揃える。 public AAA aaa; } // 追加 [Serializable] public class AAA { public int bbb; public int ccc; } public class JsonReader : MonoBehaviour { void Start() { string inputString = Resources.Load<TextAsset>("input").ToString(); InputJson inputJson = JsonUtility.FromJson<InputJson>(inputString); Debug.Log(inputJson.aaa.bbb); // 111 Debug.Log(inputJson.aaa.ccc); // 222 } }
パターン3
配列。
{ "aaa": [1, 3, 5, 7, 9] }
using System; using UnityEngine; [Serializable] public class InputJson { public int[] aaa; } public class JsonReader : MonoBehaviour { void Start() { string inputString = Resources.Load<TextAsset>("input").ToString(); InputJson inputJson = JsonUtility.FromJson<InputJson>(inputString); Debug.Log(inputJson.aaa[3]); // 7 } }
パターン4
オブジェクトの配列。
{ "aaa": [ {"bbb": "111", "ccc": "222"}, {"bbb": "333", "ccc": "444"} ] }
using System; using UnityEngine; [Serializable] public class InputJson { public AAA[] aaa; } [Serializable] public class AAA { public int bbb; public int ccc; } public class JsonReader : MonoBehaviour { void Start() { string inputString = Resources.Load<TextAsset>("input").ToString(); InputJson inputJson = JsonUtility.FromJson<InputJson>(inputString); Debug.Log(inputJson.aaa[0].bbb); // 111 Debug.Log(inputJson.aaa[1].ccc); // 444 } }
Unityでの入力ファイルの形式って何がよく使われてるんだろうか。