読者です 読者をやめる 読者になる 読者になる
【スポンサーリンク】

【Unity5.3】JsonUtility使い方まとめ

JsonUtilityとは?

オブジェクトをJSON形式の文字列にしたり、JSON形式の文字列をオブジェクトにしたりできるJSONパーサ。今までMiniJSON、SimpleJSONなど外部ライブラリがあったが、Unity5.3で公式にJSONパーサが実装された。

変換メソッドについて

オブジェクト → JSONにしたい場合は、
string json = JsonUtility.ToJson(myObject);

JSON → オブジェクトにしたい場合は、
MyObject myObject = JsonUtility.FromJson(json);

サンプルコード

変換対象クラスのサンプル
using UnityEngine;
using System.Collections;

[System.Serializable]
class MyObject {
	public Vector3 vector;
	public int[] intArray;
	[SerializeField]
	private float privateFloat;

	public float PrivateFloat {
		get {return privateFloat;}
		set {privateFloat = value;}
	}
}
確認用コード(適当なゲームオブジェクトに貼り付ける)
using UnityEngine;
using System.Collections;

public class JSONTest : MonoBehaviour {

	void Start () {
		MyObject myObject = new MyObject();
		myObject.vector = new Vector3(1, 2, 3);
		myObject.intArray = new int[3];
		myObject.intArray[0] = 4;
		myObject.intArray[1] = 5;
		myObject.intArray[2] = 6;
		myObject.PrivateFloat = 1.23f; /* private変数は[SerializeField]がないと保存されない */

		/* オブジェクトからJSONへの変換 */
		string json = JsonUtility.ToJson(myObject);
		Debug.Log(json);

		/* JSONからオブジェクトへの変換(その1) */
		MyObject obj1 = JsonUtility.FromJson<MyObject>(json);
		Debug.Log(
			obj1.vector + ", [" +
			obj1.intArray[0] + ", " + obj1.intArray[1] + ", " + obj1.intArray[2] + "], " +
			obj1.PrivateFloat
		);

		/* JSONからオブジェクトへの変換(その2) */
		MyObject obj2 = new MyObject(); //初期化が必要
		JsonUtility.FromJsonOverwrite(json, obj2); //obj2が初期化されてないとエラーになる
		Debug.Log(
			obj2.vector + ", [" +
			obj2.intArray[0] + ", " + obj2.intArray[1] + ", " + obj2.intArray[2] + "], " +
			obj2.PrivateFloat
		);
	}

}

実行結果

きちんと変換できてます。
f:id:Phalusamil:20151210200117p:plain

その他メモ

変換対象クラスの4行目にある[System.Serializable]はあってもなくても動作する。が、あったほうが高速らしい。

JSONに変換される変数はpublic変数、または[SerializeField]がついている変数だけ。なのでprivate変数を変換したい時はサンプルにあるように[SerializeField]をつける。

JSON → オブジェクトにする方法としてFromJsonOverwriteメソッドもある。
公式では、すでにインスタンス化されてるオブジェクトに入れたい時はこっちを使うと書いてあったが、FromJsonメソッドでも正しく動作した。
もしかしたら、メモリ効率や速度などに利点があるのかもしれないので、一応FromJsonOverwriteメソッドを使ったほうがいいかもしれない。

参考文献

docs.google.com

【スポンサーリンク】