C#er には標準ライブラリーに準じてお馴染みらしい JSON を扱うライブラリー Newtonsoft.Json があるようだ。しかし、こういってはなんだがろくな解説が無い(個人の感想です。)ので私が使うにあたり最低限調査したメモを残す。
使用する主な名前空間は2つ。Linq も using しないと一見 LINQ 的には使わない場合にも面倒が起こる。具体的にはこのあとすぐに実装例に使う JToken が Linq 名前空間に所属している。
using Newtonsoft.Json; using Newtonsoft.Json.Linq;
こうしたライブラリーの具体的な使用例は主には構造化されたデータの JSON 化と言語ネイティブデータ構造への戻しだろう。Newtonsoft.Json を C# で使う場合それは非常に簡単に実装できる。
class MyDataType { public int Nyanko { get; set; } public string Wanko { get; set; } } void Experiment() { // 言語ネイティブなユーザー定義型 -> JSON オブジェクト var data = new MyDataType() { Nyanko = 123, Wanko = "woowoo" }; var json_object = JToken.FromObject( data ); // JSON オブジェクト -> JSON 文字列 var json_string = json_object.ToString(); // JSON 文字列 -> 言語ネイティブなユーザー定義型 var data2 = JsonConvert.DeserializeObject< MyDataType >( json_string ); }
型がどうで文字列にするとどうで、そういう事はデバッガーやインテリセンスで見れば良い事なのでこのメモでは解説を省く。
この方法の優秀な点として、
- ユーザー定義型やそのプロパティーに特別な属性を追加する必要は無い事。(器用な事をやりたければ専用の属性を追加する方法もある)
JToken.FromObject/JsonConvert.DeserializeObject< T >はIEnumerableやDictionaryを自動的に扱ってくれる事。
が挙げられる。
例えば、 WPF の ListView コントロールのデータの実体としてしばしば扱う事になる System.Collections.ObjectModel 名前空間の ObservableCollection 型があるが、これの扱いも特別に気にする必要無く Newtonsoft.Json は JSON との相互変換を行ってくれる。
var data = new ObservableCollection< MyDataType >(); data.Add( new MyDataType() { Nyanko = 1, Wanko = "wanwan" } ); data.Add( new MyDataType() { Nyanko = 3, Wanko = "qwwwn" } ); var json_object = JToken.FromObject( data ); Console.WriteLine( json_object );
このような応用の場合にも特別な事は不要で JSON 化できる。以下はこの結果得られる JSON:
[ { "Nyanko": 1, "Wanko": "wanwan" }, { "Nyanko": 3, "Wanko": "qwwwn" } ]
C# ネイティブのオブジェクトへ戻す場合も特別な事は不要:
// 既にある ObservableCollection< MyDataType > のオブジェクトへ直接戻せる data.Clear(); data = JsonConvert.DeserializeObject< ObservableCollection< MyDataType >>( json_object.ToString() ); foreach ( var datum in data ) Console.WriteLine( "N={0} W={1}", datum.Nyanko, datum.Wanko );
N=1 W=wanwan N=3 W=qwwwn
たいへん便利😃
大雑把にはこれだけで十分に使えるが JValue JObject JArray の基本的な構成と取り扱い、ライブラリーの全貌、詳細については
など眺めるとよい。
たいへん有名なライブラリーらしいのでググって解説記事でも見たほうが早いだろうと私も使い始めに思ったのだけど、どうもインチキな解説やわかっていない解説が上位に並び時間を無駄にした。今回メモに残した大雑把な使い方と公式 API Reference をながめるのがよい。