【Unity】モデルクラスを作らずにJsonを管理する方法(dymanic)

Unity
スポンサーリンク

概要

dymanicNewtonsoft.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,
	});
}
スポンサーリンク
Unity
スポンサーリンク
シェアボタン ('ω')ノ
ゲーム開発技術ブログ スメラテ すめらて
タイトルとURLをコピーしました