single.php

JSON形式のシリアライズとデシリアライズ

久しぶのにコード記事を投稿。どこがそんなに良いのか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);

スポンサーリンク

最後までご覧いただき、ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です