よくUnityを触っていると「これどうすればいいの!?」にぶつかるのですが、今回はJSONで躓いたのでその辺を書こうと思います。
UnityでJSONを使うときはMiniJSONを使っている方も多いかと思います。
例えば…
{"name":"UMR", "score":9990000}
こういった1次的なデータならDictionaryに変更が簡単です。
ですが、以下のようなランキングデータを作ろうとするとどうにもうまくいきません
JSONを使うときは、こういった複数の構造の方がよく使うかと思います。
どうすれば扱いやすい形にできるかな……と、味付けゆで卵を作っているときに考えておりましたw
【Unity】複数あるJSONデータをListで取得しよう【MiniJson】
以下のような仕組みでつくっています。
- JSONデータをIListにする
- IListの中身を一つずつ取り出してDictionary<string, string>にする。
- 取り出したDictionaryをListにくっつける
- 完成!
今回は私のプログラムの都合上Dictionary<string,string>で取り出してますが、Dictionary<string,object>で取り出して型を変換して使っても良いかもです。
0.準備
まずはここからMiniJSONを持ってきましょう。
右側の「Download ZIP」ボタンでダウンロードができます。
ダウンロードしたらAssetsの中にPluginsのフォルダを作って、そこにMiniJSON.csをいれましょう。
最後に使うファイルにusingをつけ足します。
1. JSONデータをIListにする
これは簡単ですw
ちなみにsourceにはJSONデータが入っています。
public IList decodeJsonString(string source){
return (IList)Json.Deserialize (source);
}
2.IListの中身を一つずつ取り出してDictionary<string, string>にする
3.取り出したDictionaryをListにくっつける
public List<Dictionary<string, string>> decodeIListToDictionary(IList json){
List<Dictionary<string, string>> dic = new List<Dictionary<string, string>> ();
foreach(IDictionary item in json){
Dictionary<string, string> d = new Dictionary<string, string> ();
//キーをdictionaryに登録する
foreach(string key in item.Keys){
d.Add (key, (string)item[key]);
}
dic.Add (d);
}
return dic;
Dictionary<string,string>の型のListを用意します。
その後、foreachでデータを一つずつ取り出しています。
そして、取り出したデータのキーを取得、取得したキーとデータをDictionaryに入れます。
できたデータはどんどんListに追加して終わりです!
コード
// **************************json系
//Jsonを受け取ってdictionary<string,string>のListで返す
public List<Dictionary<string, string>> decodeJson(string source){
IList json = decodeJsonString (source);
return decodeIListToDictionary(json);
}
/// <summary>
/// jsonをIList形式にする
/// </summary>
/// <returns>The json string.</returns>
/// <param name="source">Source.</param>
public IList decodeJsonString(string source){
return (IList)Json.Deserialize (source);
}
/// <summary>
/// IListからDictionaryに変換する
/// </summary>
/// <returns>List<dictionary<string,string>></returns>
/// <param name="json">Json.</param>
public List<Dictionary<string, string>> decodeIListToDictionary(IList json){
List<Dictionary<string, string>> dic = new List<Dictionary<string, string>> ();
foreach(IDictionary item in json){
Dictionary<string, string> d = new Dictionary<string, string> ();
//キーをdictionaryに登録する
foreach(string key in item.Keys){
d.Add (key, (string)item[key]);
}
dic.Add (d);
}
return dic;
}