C#でJSONの読み書き~Json.NETを使ってみる~
最近は、何かとJSON形式でデータを扱うこと多いですよね。
てことで、C#でJSONの読み書きをやってみました。
C#でJSON扱うときは、↓のライブラリを使うのが定番っぽい。
Json.NET
ASP.net WebAPIのJSONシリアライザの標準実装らしいです。
てかダウンロード数半端ないですね。
インストールは、Nugetから以下のコマンドで。
Install-Package Newtonsoft.Json
使ってみた
サンプルコードとか
以下のページにサンプルコードがたくさんあります。
この辺見てけば、何となく使い方は掴めそう。
http://www.newtonsoft.com/json/help/html/Samples.htm
その他メモ
よく使いそうな操作についてメモ。
JSONへのシリアライズ
// データ型定義 public class Person { public string Name { get; set; } public int Age { get; set; } } ・・・中略・・・ // クラスのインスタンスをシリアライズ var person1 = new Person { Name = "hogeさん", Age = 20, }; string json1 = JsonConvert.SerializeObject(person1, Formatting.Indented); Console.WriteLine(json1); // 匿名クラスのインスタンスをシリアライズ var person2 = new { Name = "hogeさん", Age = 20 }; string json2 = JsonConvert.SerializeObject(person2, Formatting.Indented); Console.WriteLine(json2);
JsonConvert.SerializeObjectに、シリアライズしたいオブジェクトを渡すことで、JSONのテキストとして取得できます。
この時、第二引数にFormatting.Indentedを指定すると、読みやすいようにフォーマットした形で出力してくれます。
JSONのデシリアライズ
今度はJSONの文字列から、C#のクラスのオブジェクトへとデシリアライズします。
型を指定して、DeserializeObjectメソッドを呼ぶだけ。
// 上でシリアライズした結果の文字列を、C#のオブジェクトへとデシリアライズ var obj = JsonConvert.DeserializeObject<Person>(json1); Console.WriteLine("Name: {0}, Age: {1}", obj.Name, obj.Age);
さくっとデシリアライズできますね。
コレクションも同じような感じでデシリアライズできます。
コレクションをデシリアライズするときは、以下のようにします。
↓こんなJSONファイルを用意しておいて
[ { "Name": "hogehoge1", "Age": 20 }, { "Name": "hogehoge2", "Age": 25 }, { "Name": "hogehoge3", "Age": 30 } ]
以下のように、コレクションの型を指定してデシリアライズします。
// コレクションのデシリアライズ var text = File.ReadAllText("Data/list.json"); var list = JsonConvert.DeserializeObject<List<Person>>(text); foreach(var item in list) { Console.WriteLine("Name: {0}, Age: {1}", item.Name, item.Age); }
LINQ to JSON
この辺のLINQでJSONを扱えるってのもなかなか便利そうです!!
http://www.newtonsoft.com/json/help/html/CreateJsonManually.htm
JObjectとJArrayというクラスを組み合わせて、JSONオブジェクトを作ったり、JSON中のデータの検索したり、、といろいろできるみたい。
// JSONオブジェクトの作成 dynamic person = new JObject(); person.Name = "ほげほげ"; person.Age = 20; Console.WriteLine(person.ToString()); // 文字列でプロパティ名を指定する var propName = "sampleText"; person[propName] = "こんな風に、プロパティ名を文字列で動的に指定して、要素を追加できる。"; Console.WriteLine(person.ToString());