Engineer Blog開発者ブログ

2020.1.20

C#でJSONを扱う

Icons made by Freepik from www.flaticon.com
 

ASP.NETを使用してシステムを構築する場合に、JSONをよく使うと思います。

新しい技術でも何でもありませんが、メモ的な意味でご紹介します。

 

DataContractJsonSerializer

.NET Frameworkは神様(冗談)なので、便利なモノを色々用意してくれています。

これはJSONの文字列をオブジェクト⇔オブジェクトをJSON文字列へ相互変換が行え、

入り組んだ配列(配列の中に配列など)も特に不便なく変換してくれます。

 

[使い方]

まず変換用のクラスを1つ用意します。

※プロジェクト名、クラス名は適当です。ここではプロジェクト名「ConsoleApp1」とします。

JsonTest.cs

using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;

namespace ConsoleApp1
{
    public static class JsonTest
    {
        /// <summary>
        /// Object → JSON
        /// </summary>
        public static string Serialize(this object @object)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                new DataContractJsonSerializer(@object.GetType()).WriteObject(stream, @object);
                return Encoding.UTF8.GetString(stream.ToArray());
            }
        }

        /// <summary>
        /// JSON → Object
        /// </summary>
        public static T Deserialize<T>(this string message)
        {
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(message)))
            {
                return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(stream);
            }
        }
    }
}

 

Program.cs

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // ①JSONメッセージ
            string jsonMessage = @"{
                ""product_id"": ""A0001"",
                ""product_name"": ""クレヨン"",
                ""color_list"": [
                  ""赤"", ""緑"", ""青""
                ]
            }";

            // ②JSONメッセージをオブジェクトへ変換(デシリアライズ)
            ProductInfo productInfo = jsonMessage.Deserialize<ProductInfo>();

            Console.WriteLine("JSON → オブジェクト");

            Console.WriteLine($"商品コード:{productInfo.product_id}");
            Console.WriteLine($"商品名:{productInfo.product_name}");
            Console.WriteLine($"色:{string.Join(",",productInfo.color_list)}");

            
            // ③JSONメッセージをオブジェクトへ変換(デシリアライズ)
            string s_productInfo = productInfo.Serialize();
            Console.WriteLine("オブジェクト → JSON");

            Console.WriteLine(s_productInfo);

            Console.ReadKey();
        }

        /// <summary>
        /// 商品情報オブジェクト
        /// </summary>
        [Serializable, DataContract]
        class ProductInfo
        {
            [DataMember]
            public string product_id { get; set; }
            [DataMember]
            public string product_name { get; set; }
            [DataMember]
            public List<string> color_list { get; set; }
        }
    }
}

 

実行結果

商品コード:A0001
商品名:クレヨン
色:赤,緑,青

 

実行プログラム内でJSON文字列をオブジェクトに変えて、オブジェクトの中身をコンソール出力しているだけなので何とも楽しくない実行結果ですが、少ないコードで楽にJSONが扱えるという所が大きなポイントです。

 

作成時のポイントは、オブジェクトのメンバーに「[DataMember]」属性を付与する事です。よく忘れてnullになったりするので注意。

また、オブジェクトクラス自体にも「[Serializable, DataContract]」属性を忘れずに。

 

「①JSONメッセージ」で文字列の頭に「@」を付けていますが、これ(逐語的識別子)については後日誰かがブログを書いてくれます。

Contact
お問い合わせ

電話番号0120 - 889 - 236
受付時間:平日 9:00-18:00