オブジェクトをJsonへシリアライズ・デシリアライズ

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

今私が作っているソフトで、HTMLとC#プログラムでデータのやりとりをしないといけなくなったのですが、その時にC#オブジェクトをJavascriptへ簡単に伝えるとなるとJsonという選択肢が一番現実的かと思います。
C#コードでJSONへデシリアライズすることになったのでコードの紹介。

一応、今後たくさん使う機会があるかと思って拡張メソッドにしてみました。ソースコードをファイルごとそのままおいておきます。

参照設定

まず参照設定に「System.Runtime.Serialization」を追加してください。.NET Frame work 3.5からのサポートみたいです。

ソースコード

using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
public static class _ext_JsonSerialize
{
    public static string SaveInJson<T>(this object obj)
    {
        DataContractJsonSerializer serialize = new DataContractJsonSerializer(typeof(T));
        using (var ms = new MemoryStream())
        {
            serialize.WriteObject(ms, obj);
            ms.Position = 0;
            using (StreamReader sr = new StreamReader(ms))
                return sr.ReadToEnd();
        }
    }
    public static T LoadInJson<T>(this string json)
    {
        DataContractJsonSerializer serialize = new DataContractJsonSerializer(typeof(T));
        using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
        {
            return (T)serialize.ReadObject(ms);
        }
    }
}

オブジェクトに対しSaveInJson(JSONへデシリアライズ)、Stringに対しLoadInJson(JSONからシリアライズ)の2つのメソッドを追加しています。
両方共ジェネリック型の指定が必須になっています。
必要に応じてソースコードから抜き出して使ってください。

シリアライズするオブジェクト

シリアライズするオブジェクトにはSerializable属性の指定だけでは正常にシリアライズ化してくれません。
DataContract属性も付ける必要があります。

[Serializable, DataContract]
public class Session
{
    [DataMember(Name = "type")]
    public string Type { get { return "session"; } set { } }
    [DataMember(Name="key")]
    public string SessionKey { get; set; }
    [IgnoreDataMember]
    public string ComputerUID { get; set; }
    [IgnoreDataMember]
    public string SelectedPath { get; set; }
}

これにデータを入れてシリアライズするとこのように変換されます。

{"key":"698358","type":"session"}

あ、あとDataMemberに対してはNameパラメータを指定してあげたほうがいいみたいです。そうしないと名前が記号を含む文字になったり名前がコロコロ変わったりと大変なことに…
デシリアライズするとこんな感じになってしまいます。

{"<ComputerUID>k__BackingField":null,"<SelectedPath>k__BackingField":null,"<SessionKey>k__BackingField":"698358"}