UnityでJsonを扱う


UnityでJsonを扱うにはいくつかライブラリがあるようです。
生存日記 | UnityのJSONパーサ
この中でJSON ObjectLitJSONを扱ってみました。

(2014.06.28 追記 : NGUIにもJsonを扱うNGUIJsonがあった

JSONObjectのライセンスはLGPL2.1と書いてあるんですが、DLしたものには特に明記はなく、Asset Storeに並んでいるものも特に明記はしていないのでこちらが適応されると思っていいんでしょうか…
LitJSONの方はパブリックドメインなので問題なく自由に使えるようです。

こんなデータをそれぞれの使い方でパースさせてみました。

{
	"persons": {
		"hoge": {
			"age":23,
			"name":"John",
			"married":true
		},
		"fuga":{
			"age":32,
			"name":"Bob",
			"married":false
		}
	},
	"dates":[
		"2014/03/12 12:00",
		"2014/04/14 22:00"
	]
}

JSONObjectの方はjsonのテキストをJSONObjectに渡すとJSONObject型となり、GetField()にてやはり同じJSONObject型を取得できる。
JSONObjectにはstr(string)やn(float/double)やb(boolean)などのプロパティがありそこからデータを取得すると期待の型で取得できる。

[unitycsharp]
JSONObject json = new JSONObject(jsonText);

Debug.Log("JSONObject Test ==============================");
Debug.Log("hoge data ====================");

JSONObject hogeInfo = json.GetField("persons").GetField("hoge");
Debug.Log(hogeInfo.GetField("name").str);
Debug.Log(hogeInfo.GetField("age").n);
Debug.Log(hogeInfo.GetField("married").b);

Debug.Log("fuga data ====================");

JSONObject fugaInfo = json.GetField("persons").GetField("fuga");
Debug.Log(fugaInfo.GetField("name").str);
Debug.Log(fugaInfo.GetField("age").n);
Debug.Log(fugaInfo.GetField("married").b);

Debug.Log("Dates ====================");
JSONObject dates = json.GetField("dates");
for (int i = 0; i < dates.Count; ++i) {
DateTime date = DateTime.Parse(dates[i].str);
Debug.Log(date.ToString("yyyy/MM/dd (ddd) HH:mm:ss"));
}
[/unitycsharp]

LitJSONの方はLitJSON.JsonMapperというクラスのToObject()メソッドにてJsonData型へ変換してくれる。こちらはブランケットでアクセスでき、jsonData[“persons”]などでアクセスすると、JsonData型で取得できる。それぞれ指定の型にしたいときは(string)jsonDataなどキャストさせることで対応できるよう。
また、jsonに対応したモデルクラス(ModelClass)などを作っておき、LitJSON.JsonMapper.ToObject()などとしておけば指定の型に解析してデータオブジェクトを作成してくれる。

[unitycsharp]
Debug.Log("LitJson Test ==============================");
Debug.Log("ToObject test ====================");
JsonData jsonData = LitJson.JsonMapper.ToObject(jsonText);
Debug.Log("hoge name");
Debug.Log(jsonData["persons"]["hoge"]["name"]);
for (int i = 0; i < jsonData["dates"].Count; ++i) {
DateTime date = DateTime.Parse((string)jsonData["dates"][i]);
Debug.Log(date.ToString("yyyy/MM/dd (ddd) HH:mm:ss"));
}

Debug.Log("ToObject<PersonalData> test ====================");
PersonalData hogeData = LitJson.JsonMapper.ToObject<PersonalData>(LitJson.JsonMapper.ToJson(jsonData["persons"]["hoge"]));
Debug.Log(hogeData.ToString());
PersonalData fugaData = LitJson.JsonMapper.ToObject<PersonalData>(LitJson.JsonMapper.ToJson(jsonData["persons"]["fuga"]));
Debug.Log(fugaData.ToString());

/**
* パーソナルデータ。
*/
public class PersonalData {
/**
* 名前。
*/
public string name;

/**
* 年齢。
*/
public int age;

/**
* 既婚かどうか。
*/
public bool married;

/**
* ToString().
*/
public override string ToString() {
return this.name + " : " + this.age + " : " + this.married;
}
}
[/unitycsharp]

>>プロジェクトファイルダウンロード(要JSONObject, LitJSON)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です