Help us understand the problem. What is going on with this article?

[Unity] MiniJsonをちょっと楽にするスクリプト

More than 5 years have passed since last update.

Unity(C#)でjsonったら

  • LitJson : 型指定して、クラスor構造体に変換する。大型プロジェクトで使うかも
  • MiniJson : object型にする。ゆるく使いたい。

LitJsonは完全に型安全にパースできるけど、
そのためにjsonに完全に対応した型を毎回つくらなきゃいけない。
状況に応じて、jsonの中身が変わるようなやつだとつらい。

最近はMiniJsonを使うほうが多いのですが、
いかんせんパラメータのアクセスが面倒。

例えばこんなjsonがあったとして…。

sample.json
{
  "result":"ok",
  "response":{
    "code":1,
    "users":[
      {"name":"kuro"},
      {"name":"tama"}
    ]
  }
}

よくある普通のjsonですが

MiniJson

Sample_MiniJson.cs
var json = (IDictionary) MiniJSON.Json.Deserialize (jsonAsset.text);

// 一階層目までは楽。
string result = (string) json["result"];

// クロの名前を…
var response = (IDictionary) json["response"];
var users = (IList) response["users"];
var kuro =  (IDictionary) users[0];
string kuroName = (string) kuro["name"];

Debug.Log(kuroName);

jsとかやってた人には耐えられない感じになります。

JsonNode.cs

MiniJson + このスクリプトを入れれば、こんなかんじでアクセス出来るようになります。
JsonNode.cs

Sample_JsonNode.cs
JsonNode json = JsonNode.Parse(jsonAsset.text);

// Get<T> で型指定して取得
string result = json["result"].Get<string>();

// IDictionary or IListは繋げられます
string kuroName = json["response"]["users"][0]["name"].Get<string>();

Debug.Log(kuroName);

for文も使えます。

Sample_foreach.cs
JsonNode json = JsonNode.Parse(jsonAsset.text);
foreach(var user in json["response"]["users"]) {
    string name = user["name"].Get<string>();
    Debug.Log(name);
}

jsなんかにくらべると、まだ固いですが。
これくらいのゆるさで使えれば、わりかし楽になるかと。

JsonNode.cs

asus4
Unity, oF, iOS, Arduinoとかカレーとか。
http://asus4.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away