はじめに
Unity(C#)でJsonを使用したくてUtf8Jsonを導入したのですが、
Utf8JsonのDeserializeでつまづいた箇所がありましたので記事にしてみました。
つまづいたのはちゃんと私が調べられてないだけですが
簡単な例
シンプルなJsonのDeserializeを実行してみます。
Unity上からなのでDebug.Logで出力しています。
エスケープ前のJson(コード上はエスケープしている状態のため)
{"type": "Apple", "size": "small"}
コード例
出力はUnityのDebug.Logを使用しています。
通常のC#ならDebug.LogをSystem.out.printlnに置き換えればいいかと思います。
// テストデータ
string json = "{\"type\": \"Apple\", \"size\": \"small\"}";
// Deserializeを実行
Dictionary<string, object> deserializeData = Utf8Json.JsonSerializer.Deserialize<dynamic>(json);
// Key,Valueのデータとして取り出す
foreach (KeyValuePair<string, object> pairData in deserializeData) {
Debug.Log(string.Format("key={0} value={1}", pairData.Key, pairData.Value));
}
出力結果(余計な部分は排除)
いたって普通に取り出せました。
key=type value=Apple
key=size value=small
つまづいた例
シンプルなJsonですと使い勝手が悪いのでオブジェクトと配列を使いたかったのです。
ただ、配列の取り出し方がよくわからなかったのでつまづいてしまいました。
フォーマットしたJson
stock_dataというオブジェクトの中に配列を持っています。
{
"stock_data": [
{
"type": "apple",
"size": "small"
},
{
"type": "pear",
"size": "large"
}
]
}
コード例
// テストデータ
string json = "{\"stock_data\":[{\"type\":\"apple\",\"size\":\"small\"},{\"type\":\"pear\",\"size\":\"large\"}]}";
// Deserializeを実行
var deserializeData = Utf8Json.JsonSerializer.Deserialize<dynamic>(json);
// stock_dataオブジェクトからデータを取り出す
List<object> stockData = deserializeData["stock_data"];
// List<object>として格納されているので取り出す
foreach (object dictionaryData in stockData) {
// objectをDictionary<string, object>に変換
Dictionary<string, object> dictionary = dictionaryData as Dictionary<string, object>;
// Key,Valueのデータとして取り出す
foreach (KeyValuePair<string, object> pairData in dictionary) {
Debug.Log(string.Format("key={0} value={1}", pairData.Key, pairData.Value));
}
}
出力結果(余計な部分は排除)
無事に取り出す事ができました。
配列データはList<object>型で取り出すという事がポイントでした。
key=type value=apple
key=size value=small
key=type value=pear
key=size value=large
余談
調査している時にC#は型が文字列で取得できるという事で
Debug.Log(deserializeData["stock_data"].GetType().FullName);
というコードを追加したのですが、
System.Collections.Generic.List`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
という形で出力されてよくわかりませんでした。(今見ると丸わかりですが…)
習熟している人ならList<object>型で取り出すだろうという発想が出たと思いますが、
C#をたまにしか触らないのでずいぶん手間がかかってしまいました…