JSONとは?
JSON
とはJavaScript Object Notation
の頭字語で、
元々JavaScript
というプログラミング言語でのオブジェクトの描き方を参考にしたデータフォーマットです。
Unity
でもデータの読み書き、受け渡しなどでよく使用されます。
JsonUtility
JsonUtility
はUnityEngine
が提供する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]
属性を持つクラスや構造体、MonoBehaviour
、ScriptableObject
になります。
クラス内のメンバーのうち、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
の値は入っていますが、TotalScore
はjson
データ上にないですしプロパティなので0のままです。
ListやDictionaryはどうなるのか?
List
とArray
とDictionary
を持つクラスを用意しました。
[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
]
}
List
とArray
のみで、Dictionary
は出力できていないのが分かります。
Jsonの使い道
セーブデータ用クラスをjson
に変換してファイルとして保存すれば簡易的なセーブデータとして使用できます。
しかし、PlayerPrefs
同様中身がそのまま覗けてしまうので暗号化するなどの対策が必要になります。
何らかのWeb
サービスのAPI
をUnity
から呼び、結果としてjson
が返ってくるものがあります。
そのjson
文字列をUnity
上で扱いやすいようオブジェクトに変換する用途にも使用できます。