概要
dymanicとNewtonsoft.Json
を使用することで、モデルクラスを用意しなくてもJsonを扱うことができる。
Unity標準で入っているのですぐに使える。
(※UnityバージョンによってはPackageを追加する必要あり)
メリット
- ちょっとしたデータ処理をする時に、いちいちモデルクラスを書かなくても良いので便利
- graphqlを使った通信の際は、モデルを作ると必要なデータだけ取得できないので、dymanicを使う方が効率が良い
- 必要なデータだけ取得できるので、可読性が上がる
デメリット
- 巨大なモデルを通信でやり取りする場合、どのモデルにどのデータが入っているのかが迷子になりやすい。(※ドキュメントでカバーできる部分)
- jsonのデータを使い回す際、モデルがあると便利な場合もある
定義
using Newtonsoft.Json;
Jsonに変換
匿名型からJsonに変換
処理
匿名型でモデルを作る。
その後JsonConverterで変換してJson化できる。
var model = new
{
fields = new
{
a = new { b = hello },
c = new[] { new { d = fuga, e = true } }
}
};
var json = JsonConvert.SerializeObject(model);
結果
{
fields :
{
"a" : { "b" : "hello" },
"c" : [ { "d" : "fuga", "e" : true } ]
}
}
Jsonから必要なデータを取得
モデルクラスを作って取得する場合
class Model
{
public int val;
}
var model = JsonConvert.DeserializeObject<Model>(json);
Debug.Log(model.val);
モデルクラスを作らずに取得する場合(dynamic)
dynamic model = JsonConvert.DeserializeObject(json);
Debug.Log(model.val);
※dynamicで取得する際、変数が定義されていなければエラーが発生してしまうので、TryCatchでエラーハンドリングするのがおすすめ!
※変数が定義されているかの判定はややこしい
dynamicを使用して配列始まりのJsonを取得する場合
Json例
[
{
"doc": {
"a": "a1",
"b": "b1",
}
},
{
"doc": {
"a": "a2",
"b": "b2",
}
}
]
処理
dynamic result = JsonConvert.DeserializeObject(json);
var dataList = result.ToObject<dynamic>();
foreach (var data in dataList)
{
m_lockedList.Add(new Model()
{
a = data.doc.a,
b = data.doc.b,
});
}