スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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が違うのは少し気持ち悪いので、私は両方に指定して使おうと思います。
スポンサーサイト
プロフィール

まこち

Author:まこち
スマートフォンのアプリ開発やWebサイト構築等を仕事や趣味でやっています。
最近はグラフデータベースも始めました。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。