かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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を使えます!