C#でJSONを読み書き

JSON (JavaScript Object Notation) と言えば、軽量で人にもコンピュータにも扱いやすいデータ交換フォーマットです。JavaScriptの表記法をベースとしているようですが、様々なソフトやプログラム言語で幅広く使われています。

 

そんなJSONC#から扱う方法についてまとめてみます。

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);

ReadObjectメソッドでストリームからJSONを取り込みオブジェクトへ変換します。