久しぶのにコード記事を投稿。どこがそんなに良いのかJSON。C#でJSONを取り扱う時に必要となる、オブジェクトとJSONの変換について書きます。
どこが良いのかJSON
ほとんど個人的な愚痴になるので、先に進みたい方は読み飛ばしてください。
一昔前は、原理主義のようにアプリケーション間のデータ受け渡しのフォーマットと言えばXMLでした。(もっと前は、CSVだったかな?)
こんなんです
<root> <user> <name>maggothand</name> <age>48</age> <sex>male</sex> </user> </root>
いつの頃からかJSONという書式が開発され、今開発されているWebAPIのパラメタや戻り値は、大抵この形式が採用されています。
こんなんです
{ "user": { "name":"maggothand", "age":48, "sex":male } }
時代の潮流というのがあって、仕方のないことなんですが、個人的にまず見辛い。データの文字量が減るというメリットもありますが、この時代に数バイトがメリットになるものなのかと…単なる愚痴と、JSONを知らない人への予備知識として紹介。
C#には専用クラスがある
.NET FrameworkにはJSONを取り扱うための専用クラスがあります。そもそもC#はオブジェクト指向の開発言語なので、あらゆるものをオブジェクトに置換えて処理する必要があり、JSONもC#の世界ではオブジェクトに置換えることができます。その仕組みを提供してくれるのが
Serialization.Json 名前空間です。
使い方は簡単で以下のように宣言します。
using System.Runtime.Serialization; using System.Runtime.Serialization.Json;
でVisualStudioのソリューション エクスプローラーなどで、参照設定で[System.Runtime.Serialization]を追加しておきます。この辺りの詳しい説明は、別で調べてください。
で宣言できたら、実際に使うことが出来ます。
簡単に書くと、こんな感じ
var serializer = new DataContractJsonSerializer(object.GetType());
実際には下準備が必要
簡単そうに見えますが、実際にコードにすると下準備が必要です。
オブジェクトにした時の入れ物になるDataContractを定義します。C++の構造体のような感じ
[DataContract] public class User { [DataMember] public string name { get; set; } [DataMember] public int age { get; set; } [DataMember] public string sex { get; set; } }
DataContractにアクセスする時は、Newします。
User user = new User(); user.name = "maggothand"; user.age = 48; user.sex = "male";
で、このDataContractをシリアライズ化処理してJSON形式に変換できます。
var stream = new System.IO.MemoryStream(); var serializer = new DataContractJsonSerializer(User.GetType()); serializer.WriteObject(stream, user); string json = Encoding.UTF8.GetString(stream.ToArray());
反対にJSON形式をオブジェクトにするにはデシリアライズ化します。
var stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(json)); var serializer = new DataContractJsonSerializer(User.GetType()); User user = (User)serializer.ReadObject(stream);
まとめ
こんな感じで、汎用的なクラスにしておくと、後から使うときに便利です。
public static class JsonUtil { public static string Serialize(object obj) { using (var stream = new System.IO.MemoryStream()) { var serializer = new DataContractJsonSerializer(obj.GetType()); serializer.WriteObject(stream, obj); return Encoding.UTF8.GetString(stream.ToArray()); } } public static T Deserialize<T>(string json) { using (var stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(json))) { var serializer = new DataContractJsonSerializer(typeof(T)); return (T)serializer.ReadObject(stream); } } }
実際に使うときはこんな感じで
User user = new User(); user.name = "maggothand"; ... string json = JsonUtil.Serialize(user); user = JsonUtil.Deserialize<User>(json);
スポンサーリンク
最後までご覧いただき、ありがとうございました。