BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

C# Json.NET 入門3 - 動的なRootNameのJsonをデシリアライズ

Root name がdynamicなjson ?ルートネームが動的なjson ?(なんと表現するのが正しいのでしょうか...)
以下のようなjsonをデシリアライズするときのお話です。

f:id:beachside:20160830184015j:plain

"araragi koyomi"と"oshino meme"の部分が動的に変わっていくケースを想定しています。 動的な名前の下には、userId、name、ageとfamilyを並べました。familyは、Personの配列です。
(familyの中のpersonにfamilyがないとかは...サンプルなので書いてないだけです)。

> Environment

> 事前準備

jsonをデシリアライズするPersonのモデルを以下のようにしました。

では、jsonのファイルを読み込んでデシリアライズするという流れをいくつかのパターンで実装していきます。

その1 - 地味にこねこね...

ファイルを読み込んで、JObjectにパースし、そこからListにパースします。

listをnewするコードなんて書きたくないし、LINQ使えよって突っ込みたくなるので...以下のようにちょっとだけ修正しました。

その2 - JsonConverterを使ってデシリアライズ

JsonConverterを使ってパースの処理を抜き出しちゃいます。
PersonクラスをデシリアライズするためのJsonConverterを継承した、PersonsConverterクラスを作ります。

使い方は、以下です。地味にこねこね時代のコードに比べると、まーすっきりします。

var persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonsConverter());

その3 - JsonConverterを使ってデシリアライズ

もうちょっと実用的な使い方として思いつくのは、Attributeにつけるパターンです(ケースバイケースですけど)。

まず、Listを以下のようにPersonsModelの中に入れました。そして、JsonConverterのAttributeをつけます。Attributeで指定している型、PersonsModelConverterクラスはこの後作ります。

次は、PersonsModelConverterクラスを書きましょう。「その1」で作ったPersonsConverterちょっと変更するだけです。

  

PersonsConverterではListを出力していましたが、PersonsModelを出力するよう変えただけです(14行目あたり)。

結果として、PersonsModelクラスは、AttributeでPersonsModelConverterを使うように指定しているため、実際にデシリアライズする使うときは以下のコードになります。もはや、普通にJsonConvert.DeserializeObjectしているだけとなります。

var personsModel = JsonConvert.DeserializeObject<PersonsModel>(json);

ModelのBehaviourをModelに依存させているという点で、ビジネスロジックに絡むところをすっきりさせれたといえますかね(個人的主観です)。

おしまい。