C#でJSONのシリアライズとデシリアライズ
C#でJSONを扱う場合.NET Frameworkが標準で提供しているSystem.Runtime.Serialization名前空間のクラスが利用できるのですが、オープンソース(MITライセンス)で提供されているJSON.NETの方が扱いやすく便利そうなので今回はこちらを利用しています。
■URL
JSON.NET
■Visual Studioの設定
ますは、上記URLよりJSON.NETをダウンロードし「Newtonsoft.Json」名前空間を参照設定に追加。
以下のパッケージマネージャコマンドでインストールするとDL、参照設定の追加が自動で行われ便利です。
========================================
PM> Install-Package Newtonsoft.Json
========================================
■実装
最初はシリアライズ/デシリアライズ対象のクラス
========================================
namespace Test
{
class Person
{
public string Name { get; set; }
public string Address{ get; set; }
}
}
========================================
シリアライズ例。シリアライズ/デシリアライズ共にJsonConvertクラスを利用します
========================================
var person = new Person()
{
Name = "テスト太郎",
Address = "東京都豊島区"
};
string json = JsonConvert.SerializeObject(person);
========================================
上記のコードで戻り値のjsonには、以下の文字列が格納されます。
{"Name":"テスト太郎","Address":"東京都豊島区"}
続いてデシリアライズの例。
========================================
string json = "{\"Name\":\"テスト太郎\",\"Address\":\"東京都豊島区\"}"
Person person = JsonConvert.DeserializeObject(json);
========================================
型パラメータでマッピングしたい型を指定します。
上記のコードでpersonオブジェクトのプロパティが設定された状態で返却されます。
ここで、気になるのがC#の場合、一般的にプロパティ名の先頭が大文字であるため、JSONで扱った場合のプロパティ名も先頭が大文字になる点です。一般的にJSONのプロパティ名は小文字が先頭になる為、今度はこちらのケースに対応する方法を説明します。
JsonConvertのシリアライズ/デシリアライズする時にどのように変換するのかJsonSerializerSettingsクラスで設定を行う事ができます。
こちらは、JsonConvertのSerializeObject、DesirializeObjectのそれぞれの引数として渡すことが出来る為、先頭小文字の設定を指示したJsonSerializerSettingsをこららのメソッドに渡す事で先頭小文字のプロパティ名に対応したJSONの変換が行えます。
それでは、早速シリアライズの例。
========================================
var person = new Person()
{
Name = "テスト太郎",
Address = "東京都豊島区"
};
string json = JsonConvert.SerializeObject(person,
new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
========================================
上記のコードで戻り値のjsonの値。
{"name":"テスト太郎","address":"東京都豊島区"}
続いてデシリアライズの例。
========================================
string json = "{\"name\":\"テスト太郎\",\"nddress\":\"東京都豊島区\"}"
Person person = JsonConvert.DeserializeObject(json,
new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
========================================
JsonSerializerSettingsのContractResolverにCamelCasePropertyNamesContractResolverのインスタンスを設定する事で先頭小文字のプロパティに対応します。
とまあ、ここまで書いたのですが、実はデシリアライズに関してはCamelCasePropertyNamesContractResolverを設定しなくても先頭小文字のプロパティに対応していました。
でも、シリアライズとデシリアライズで利用するResolverが違うのは少し気持ち悪いので、私は両方に指定して使おうと思います。
■URL
JSON.NET
■Visual Studioの設定
ますは、上記URLよりJSON.NETをダウンロードし「Newtonsoft.Json」名前空間を参照設定に追加。
以下のパッケージマネージャコマンドでインストールするとDL、参照設定の追加が自動で行われ便利です。
========================================
PM> Install-Package Newtonsoft.Json
========================================
■実装
最初はシリアライズ/デシリアライズ対象のクラス
========================================
namespace Test
{
class Person
{
public string Name { get; set; }
public string Address{ get; set; }
}
}
========================================
シリアライズ例。シリアライズ/デシリアライズ共にJsonConvertクラスを利用します
========================================
var person = new Person()
{
Name = "テスト太郎",
Address = "東京都豊島区"
};
string json = JsonConvert.SerializeObject(person);
========================================
上記のコードで戻り値のjsonには、以下の文字列が格納されます。
{"Name":"テスト太郎","Address":"東京都豊島区"}
続いてデシリアライズの例。
========================================
string json = "{\"Name\":\"テスト太郎\",\"Address\":\"東京都豊島区\"}"
Person person = JsonConvert.DeserializeObject
========================================
型パラメータでマッピングしたい型を指定します。
上記のコードでpersonオブジェクトのプロパティが設定された状態で返却されます。
ここで、気になるのがC#の場合、一般的にプロパティ名の先頭が大文字であるため、JSONで扱った場合のプロパティ名も先頭が大文字になる点です。一般的にJSONのプロパティ名は小文字が先頭になる為、今度はこちらのケースに対応する方法を説明します。
JsonConvertのシリアライズ/デシリアライズする時にどのように変換するのかJsonSerializerSettingsクラスで設定を行う事ができます。
こちらは、JsonConvertのSerializeObject、DesirializeObjectのそれぞれの引数として渡すことが出来る為、先頭小文字の設定を指示したJsonSerializerSettingsをこららのメソッドに渡す事で先頭小文字のプロパティ名に対応したJSONの変換が行えます。
それでは、早速シリアライズの例。
========================================
var person = new Person()
{
Name = "テスト太郎",
Address = "東京都豊島区"
};
string json = JsonConvert.SerializeObject(person,
new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
========================================
上記のコードで戻り値のjsonの値。
{"name":"テスト太郎","address":"東京都豊島区"}
続いてデシリアライズの例。
========================================
string json = "{\"name\":\"テスト太郎\",\"nddress\":\"東京都豊島区\"}"
Person person = JsonConvert.DeserializeObject
new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
========================================
JsonSerializerSettingsのContractResolverにCamelCasePropertyNamesContractResolverのインスタンスを設定する事で先頭小文字のプロパティに対応します。
とまあ、ここまで書いたのですが、実はデシリアライズに関してはCamelCasePropertyNamesContractResolverを設定しなくても先頭小文字のプロパティに対応していました。
でも、シリアライズとデシリアライズで利用するResolverが違うのは少し気持ち悪いので、私は両方に指定して使おうと思います。
スポンサーサイト

