コンテンツへスキップ

C# JSONをObjectに変換(System.Runtime.Serialization.Json)

C#でJSONをObjectに変換する

概要

AjaxやオープンデータでJSON利用が多く使われる中、

.NetでもJSON使いたくなったのでやってみました。

JSON.NETなどのライブラリもありますが、

.NetFrameWorkで実装(3.5~?)されているものだけでやってみます。

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

を使います。

 

実装

JSONを受け取る場合、対応するデータ構造を保持したクラスが必須になります。

こんな感じでしょうか。

        [DataContract]
        public class PersonData
        {
            [DataMember]
            public int Seq { get; set; }
            [DataMember]
            public string Name { get; set; }
        }

ここに定義されている項目がJSONのキーと一致した場合に格納されます。

(キー名と項目名は完全一致が必要)

なお、JSON側にあって、構造体クラスにない場合は無視されるのみのようです。

その逆も同様です。

 

次にJSONを構造体クラスに格納するメソッドです。

        public static object getObjectFromJson(string jsonString, Type t)
        {
            var serializer = new DataContractJsonSerializer(t);
            var jsonBytes = Encoding.Unicode.GetBytes(jsonString);
            var sr = new MemoryStream(jsonBytes);
            return serializer.ReadObject(sr);
        }

MSDNのまんまです。

Type t には格納先構造体のクラスタイプをセットします。

この場合はPersonDataのタイプですね。

jsonStringはJSON文字列です。

こんな感じ

{“Seq”:”1″, “Name”:”AAAAAAA”}

 

構造体をメソッドをクラスに入れて定義しておくと

便利でしょう。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace Sample
{
    public class JsonHandler
    {
        /// <summary>
        /// JSON値をobjectにして返却
        /// </summary>
        /// <param name="jsonString"></param>
        /// <param name="t"></param>
        /// <returns></returns>
        public static object getObjectFromJson(string jsonString, Type t)
        {
            var serializer = new DataContractJsonSerializer(t);
            var jsonBytes = Encoding.Unicode.GetBytes(jsonString);
            var sr = new MemoryStream(jsonBytes);
            return serializer.ReadObject(sr);
        }

        /// <summary>
        /// JSONから受け取ったPersonDataの構造体
        /// </summary>
        [DataContract]
        public class PersonData
        {
            [DataMember]
            public int Seq { get; set; }
            [DataMember]
            public string Name { get; set; }
        }    
    }
}

 

使ってみる

string jsonString = "{""Seq"":""1"", ""Name"":""AAAAAAA""}";
JsonHandler.PersonData pd = (JsonHandler.PersonData)JsonHandler.getObjectFromJson(
    jsonString,
    typeof(JsonHandler.PersonData)
);

Console.WriteLine("Seq:{0} Name:{1}", pd.Seq, pd.Name);

JSON文字列を入れることで構造体にセットして返却されると思います。

 

割とあっさり実装できましたね。

ASP.NETだけでなくWindowsApplication等でも

データインターフェースにJSONを使う機会は多くなるでしょう。

HTTP経由のデータのみをやり取りするので

PHPやJAVAとの連携も容易ですね。

 

JSONと聞いて金曜日と答える後輩も

そろそろ覚えてくれたことでしょうか。

 

コメントを残す

メールアドレスが公開されることはありません。