SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

C#でJSONの読み書き~Json.NETを使ってみる~

最近は、何かとJSON形式でデータを扱うこと多いですよね。
てことで、C#JSONの読み書きをやってみました。

C#JSON扱うときは、↓のライブラリを使うのが定番っぽい。

Json.NET

ASP.net WebAPIのJSONリアライザの標準実装らしいです。
てかダウンロード数半端ないですね。
f:id:minami_SC:20150608172608p:plain:w250

インストールは、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を指定すると、読みやすいようにフォーマットした形で出力してくれます。
f:id:minami_SC:20150608172622p:plain

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

この辺のLINQJSONを扱えるってのもなかなか便利そうです!!
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());