JSONとは?

JSONとはJavaScript Object Notationの頭字語で、

元々JavaScriptというプログラミング言語でのオブジェクトの描き方を参考にしたデータフォーマットです。

Unityでもデータの読み書き、受け渡しなどでよく使用されます。

JsonUtility

JsonUtilityUnityEngineが提供するJsonデータの変換、出力用ユーティリティです。

EditorJsonUtilityというのもあります。

JsonUtilityを使って、オブジェクトのJson化とJsonからのオブジェクト生成の流れを確認します。

Json化する

JsonUtility.ToJsonメソッドでオブジェクトをJson化できます。

以下の様なクラスを用意しました。

[Serializable]
public class TestData
{
		public int Score;
		
		[SerializeField] private int Value;
		
		private int PrivateValue;
		
		[NonSerialized] public int PublicValue;

		public int TotalScore { get; set; }
		
		private int LocalValue { get; }
}

以下のコードで、TestDataクラスのインスタンスを用意し、

一部パラメータを変更し、JsonUtility.ToJsonに渡してみます。

TestData testData = new TestData();

testData.Score = 123;
testData.TotalScore = 1234;

string json = JsonUtility.ToJson(testData);

json文字列の中身は以下の様になっています。

{"Score":123,"Value":0}

ちなみにJsonUtility.ToJsonの第二引数にtureを渡すと以下の様に読みやすい形式で出力されます。

// string json = JsonUtility.ToJson(testData, true);
{
    "Score": 123,
    "Value": 0
}

JsonUtility.ToJsonに渡せるオブジェクトは、[Serializable]属性を持つクラスや構造体、MonoBehaviourScriptableObjectになります。

クラス内のメンバーのうち、Jsonに出力されるにはシリアライザーにサポートされている必要があります。

そのため、privateなフィールド、プロパティは出力されていません。

publicなフィールド、privateだけど[SerializeField]属性を持つフィールドは出力されます。

publicだけど[NonSerialized]なフィールドも出力されません。

Jsonからオブジェクトを生成する

今度は逆にJsonからオブジェクトを生成してみます。

オブジェクトを生成するには、JsonUtility.FromJson** メソッドを使用します。**

先ほどのjsonを文字列として渡してみます。

string json = @"{""Score"":123,""Value"":0}";

var testData = JsonUtility.FromJson<TestData>(json);

Debug.Log(testData.Score);
Debug.Log(testData.TotalScore);

json文字列からTestDataオブジェクトを生成できました。

Scoreの値は入っていますが、TotalScorejsonデータ上にないですしプロパティなので0のままです。

ListやDictionaryはどうなるのか?

ListArrayDictionaryを持つクラスを用意しました。

[Serializable]
public class TestData
{
    public List<int> _list = new();
    
    public int[] _array = new int[10];

    public Dictionary<string, int> _dictionary = new();
}

こちらを以下の様にしてみると

TestData testData = new TestData();

testData._list.Add(1);
testData._list.Add(2);
testData._list.Add(3);
testData._list.Add(4);
testData._array[0] = 1;
testData._array[1] = 2;
testData._array[2] = 3;
testData._array[3] = 4;
testData._dictionary.Add("key1", 1);
testData._dictionary.Add("key2", 2);
testData._dictionary.Add("key3", 3);
testData._dictionary.Add("key4", 4);

string json = JsonUtility.ToJson(testData, true);

Debug.Log(json);

以下の様になりました。

{
    "_list": [
        1,
        2,
        3,
        4
    ],
    "_array": [
        1,
        2,
        3,
        4,
        0,
        0,
        0,
        0,
        0,
        0
    ]
}

ListArrayのみで、Dictionaryは出力できていないのが分かります。

Jsonの使い道

セーブデータ用クラスをjsonに変換してファイルとして保存すれば簡易的なセーブデータとして使用できます。

しかし、PlayerPrefs同様中身がそのまま覗けてしまうので暗号化するなどの対策が必要になります。

何らかのWebサービスのAPIUnityから呼び、結果としてjsonが返ってくるものがあります。

そのjson文字列をUnity上で扱いやすいようオブジェクトに変換する用途にも使用できます。