Unity 3 D開発小贴士(十四)JsonUtility


Jsonは現在非常によく使われているデータフォーマットです。Netのバージョンの問題は、すべての便利な方法がなくて、直接Unityの中でC#公式のJsonライブラリを使用することができて、そこでUnity 3 Dは自分で自分のJsonツール--JsonUtilityを提供しました。


次の例を参照してください.
using UnityEngine;
using System.Collections;

public class TestSer
{
	public int i;
	public string str;
}

public class TestDeser
{
	public string str;
	public float i;
}
public class TestDeser2
{
	public string st;
	public float f;
}

public class NewBehaviourScript : MonoBehaviour {

	// Use this for initialization
	void Start () {
		TestSer ts = new TestSer();
		ts.i = 10;
		ts.str = "aaaa";
		string json = JsonUtility.ToJson (ts);
		Debug.Log (json); 
		TestDeser td = JsonUtility.FromJson (json);
		Debug.Log (td.str);
		Debug.Log (td.i);
		TestDeser2 td2 = JsonUtility.FromJson (json);
		Debug.Log (td2.st);
		Debug.Log (td2.f);
	}
}

JsonUtilityは使いやすく、節操の制約がないことがわかります.
JsonUtilityは配列をサポートし、直列化可能なカスタムタイプ、すなわちSystemを追加する必要がある.Serializableプロパティ(プロパティについては、C#構文の小知識(七)プロパティを参照).
例:
[System.Serializable]
public struct TestObj
{
	public string ttt;
}

public class TestSer2
{
	public int i;
	public string str;
	public TestObj obj;
	public int[] arr;
	public GameObject go;
}

シーケンス化:
		TestSer2 ts2 = new TestSer2();
		ts2.i = 10;
		ts2.str = "aaaa";
		ts2.obj = new TestObj ();
		ts2.obj.ttt = "tttt";
		ts2.arr = new int[3];
		ts2.arr [0] = 1;
		ts2.arr [1] = 1;
		ts2.arr [2] = 1;
		ts2.go = new GameObject ("go");
		string json = JsonUtility.ToJson (ts2);

印刷結果:
{"i":10,"str":"aaaa","obj":{"ttt":"tttt"},"arr":[1,1,1],"go":{"instanceID":-12766}}

間違いなく、JsonUtilityはC反射(C文法の小知識(10)反射を参照)を使用しているので、効率が悪くなります.効率面では、マイクロソフトの自社のBinaryやXMLライブラリのほうが少し良いに違いありません.(詳細はC#構文小知識(十六)シーケンス化と逆シーケンス化(XML)とC#構文小知識(十七)シーケンス化と逆シーケンス化(Binary)を参照)