かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

JSON形式をC#のオブジェクトにシリアライズ・デシリアライズする

最近Web APIでサポートされることが激しく多くなってるJSONですが、C#でも手軽に扱えるようになってます。
DataContractとかDataMember属性を使うと要素名とかまで指定できますが、属性とかつけなくても使うだけなら全然使えます。しかも使い方は簡単!ということで忘れないようにコード例だけ書いてメモっておきます。

namespace ConsoleApplication15
{
    using System;
    using System.IO;
    using System.Runtime.Serialization.Json;
    using System.Text;

    class Program
    {
        static void Main(string[] args)
        {
            // System.Runtime.Serialization.Json.DataContractJsonSerializerが肝!
            // コンストラクタで型を指定するのが肝です
            var s = new DataContractJsonSerializer(typeof(Person));

            // 読み書きするためのストリーム(本番はWebからのストリームになると思われる)
            var ms = new MemoryStream();

            // ストリームにオブジェクトを書き込む
            s.WriteObject(ms, new Person { Name = "かずき" });

            // JSONを出力
            Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));

            // 読み込むためにストリームの位置を最初に戻す
            ms.Seek(0, SeekOrigin.Begin);

            // JSONからオブジェクトへ!
            var p = s.ReadObject(ms) as Person;

            // 名前を出力してみる
            Console.WriteLine(p.Name);
        }
    }

    public class Person
    {
        public string Name { get; set; }
    }
}

実行結果は以下のようになります。

{"Name":"かずき"}
かずき

因みにDataMember属性を指定することでJSONにするときのキーの名前を指定できます。

[DataContract]
public class Person
{
    // 属性で要素名を指定する
    [DataMember(Name="fullname")]
    public string Name { get; set; }
}

上記のようにDataMember属性をつけて実行すると、以下のような結果になります。

{"fullname":"かずき"}
かずき

これで自由自在にJSONのAPIを使えます!