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と聞いて金曜日と答える後輩も
そろそろ覚えてくれたことでしょうか。