JSON (JavaScript Object Notation) と言えば、軽量で人にもコンピュータにも扱いやすいデータ交換フォーマットです。JavaScriptの表記法をベースとしているようですが、様々なソフトやプログラム言語で幅広く使われています。
そんなJSONをC#から扱う方法についてまとめてみます。
JSONを扱う為のライブラリはいくつかあるようですが、ここでは.Net Frameworkで提供されるものを使ってみます。
環境の準備
JSONを扱う為のには、プロジェクトに参照の追加をする必要があります。
以下の手順でアセンブリSystem.Runtime.Serializationへの参照をプロジェクトに追加しましょう。
参照の追加
メニューから[プロジェクト(P)]→[参照の追加(R)...]を選択します。
参照マネージャー画面が開きます。
左側のツリーから[アセンブリ]→[フレームワーク]を選択します。
一覧からSystem.Runtime.Serializationを探してチェックして[OK]ボタンをクリックします。
オブジェクトをJSONに変換 (JSON形式で保存する)
JSONへ変換するにはSystem.Runtime.Serialization.Json.DataContractJsonSerializerクラスを使います。
以下の例では、TestItemというクラスをJSON形式へ変換しています。
public class TestItem { public int Code { get; set; } public String Name { get; set; } }
public void JSONTest() { var item = new TestItem(); item.Code = 0; item.Name = "TEST"; using (var stream = new MemoryStream()) { var serializer = new DataContractJsonSerializer(typeof(TestItem)); serializer.WriteObject(stream, item); } }
DataContractJsonSerializerクラスのコンストラクタへ変換するクラスのタイプを渡します。
WriteObjectメソッドでJSON形式へ変換された結果がストリームへ書き出されます。
JSONへの変換結果は以下のようになります。
{"Code":0,"Name":"TEST"}
配列をJSONへ変換 (JSON形式で保存する)
配列をJSONへ変換する時もやり方は上記と一緒です。
public void JSONTest() { var items = new TestItem[3]; items[0] = new TestItem(); items[0].Code = 0; items[0].Name = "TEST0"; items[1] = new TestItem(); items[1].Code = 1; items[1].Name = "TEST1"; items[2] = new TestItem(); items[2].Code = 2; items[2].Name = "TEST2"; using (var stream = new MemoryStream()) { var serializer = new DataContractJsonSerializer(typeof(TestItem[])); serializer.WriteObject(stream, items); } }
DataContractJsonSerializerクラスのコンストラクタへ変換する配列のタイプを渡します。
WriteObjectメソッドでJSON形式へ変換された結果がストリームへ書き出されます。
JSONへの変換結果は以下のようになります。
[{"Code":0,"Name":"TEST0"},{"Code":1,"Name":"TEST1"},{"Code":2,"Name":"TEST2"}]
JSONへの出力項目を制御する
JSONのキーを指定する
上記の例ではJSONのキーはプロパティ名になっていますが、場合によってはキーを別の文字列にしたい事があるかもしれません。
そのような場合は変換したいクラスへ[DataContract]属性や[DataMember]属性を指定します。
以下の例ではキーが小文字になるように定義しています。
using System.Runtime.Serialization; [DataContract] public class TestItem { [DataMember(Name = "code")] public int Code { get; set; } [DataMember(Name = "name")] public String Name { get; set; } }
まずSystem.Runtime.Serializationをusingします。
クラスに[DataContract]属性を付与します。
各プロパティに[DataMember]属性を付与してキーの名称を定義します。
JSONへの変換結果は以下のようになります。
{"code":0,"name":"TEST"}
JSONに出力しない項目を指定する
プロパティに出力したくないものがある場合は[IgnoreDataMember]属性を付与します。
以下の例ではNameプロパティを出力しないように定義しています。
using System.Runtime.Serialization; [DataContract] public class TestItem { [DataMember(Name = "code")] public int Code { get; set; } [IgnoreDataMember] public String Name { get; set; } }
JSONへの変換結果は以下のようになります。
{"code":0}
JSONからオブジェクトを生成 (JSON形式を読み込む)
JSONからオブジェクトを生成する場合もSystem.Runtime.Serialization.Json.DataContractJsonSerializerクラスを使います。
var serializer = new DataContractJsonSerializer(typeof(TestItem)); TestItem item = (TestItem)serializer.ReadObject(stream);
コメントをお書きください