[C#] クラスオブジェクトをJSON形式のテキストにシリアライズする(DataContractJsonSerializer)

Pocket

ここでは、C#で、.NetFrameworkライブラリの DataContractJsonSerializer クラスを使って、クラスオブジェクトをJSON形式のテキストにシリアライズ(変換)するサンプルコードを掲載しています。

スポンサーリンク

使用するクラスオブジェクト

ここで紹介するサンプルでは次のクラスを使用します。

// 参照の追加の必要あり
//using System.Runtime.Serialization;

    [DataContract]
    class ProductData
    {
        public ProductData()
        {
            header = new HeaderData();
            body = new BodyData();
        }

        /*
         * DataMember Name属性でJSON出力時のキー名を設定できる
         * 設定しない場合は、宣言した名前と同じになる
         */
        [DataMember(Name = "header")]
        public HeaderData header { get; set; }

        [DataMember(Name = "body")]
        public BodyData body { get; set; }

        /*
         * IgnoreDataMember でシリアライズ対象外となる
         */
        [IgnoreDataMember]
        public string ignoreText { get; set; }
    }

    [DataContract]
    class HeaderData
    {
        [DataMember(Name = "name")]
        public string name { get; set; }
    }

    [DataContract]
    class BodyData
    {
        [DataMember(Name = "area")]
        public string area { get; set; }
    }

シリアライズによって出力されるJSONテキストは、次の通りです。なお、改行は読みやすくなるように入れています。

{
   "header":
   {
      "name":"桃"
   },
   "body":
   {
      "area":"山梨"
   }
}

 

クラスオブジェクトをJSONにシリアライズ(デシリアライズ)

上記クラスをJSONにシリアライズするサンプルコードは次の通りです。サンプル内ではJSONからクラスオブジェクトへデシリアライズも行っています。

            // クラスオブジェクトに値を設定
            var p = new ProductData();
            p.header.name = "桃";
            p.body.area = "山梨";

            using (var ms = new MemoryStream())
            using (var sr = new StreamReader(ms))
            {
                // オブジェクトの内容をJSONにシリアライズ
                var serializer = new DataContractJsonSerializer(typeof(ProductData));
                serializer.WriteObject(ms, p);

                // 読み出し位置を先頭に戻す
                ms.Position = 0;
                // シリアライズしたJSONを読み込む
                string json = sr.ReadToEnd();

                // 確認用に出力
                WriteLine(json); 

                // 読み出し位置を先頭に戻す
                ms.Position = 0;

                // JSONからクラスオブジェクトへデシリアライズ
                var de = (ProductData)serializer.ReadObject(ms);

                // 確認用に出力
                WriteLine("Name = " + de.header.name); 
                WriteLine("Area : " + de.body.area); 
            }

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *