メモの穴

メモ化

UnityでJSONファイルを読み込むメモ

環境

Windows10
Unity 2019.1.1f1

やること

4パターンの入力ファイルをそれぞれ読み取る。
どのパターンでも流れは同じで以下の通り。

  1. JSONの構造を表現するクラスを用意
  2. 入力ファイルをstring型で受け取り
  3. 1で用意したクラスへデシリアライズ
参考

www.sawalemontea.com

qiita.com

qiita.com

パターン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);

以下、C#スクリプト全体

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での入力ファイルの形式って何がよく使われてるんだろうか。