BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

C# Json.net 入門2:JsonSerializerSettings

🚧 2020/02 追記: JSON の扱いに関するに新しい情報があります。
blog.beachside.dev





WebApiだったりAzure DocumentDBだったり色々と使っているJson.NET、新人さん向け内容の整理メモの第2回目です。
前回に引き続きシリアライズ・デシリアライズ時をJsonConvertを利用して処理するについて、
JsonSerializerSettingsで使いそうなもの、使えそうなものを解説します。

f:id:beachside:20160420084028j:plain

> Environment

サンプルを書いた環境は以下です。

  • Visual Studio 2015 (update2)
  • NugetでNewtonsoft.Jsonをインストール 

Newtonsoft.Jsonは、2016/4時点で最新の8.0.3を使っています。

> Overview

C# Json.net 入門1:JsonConvert(前回)

1. JsonConvertでサクッとシリアライズ・デシリアライズ
2. プロパティ名をキャメルケースで出力
余談:スーパークラス化、スネークケース

1. Formatting

シリアライズしてjson形式のstringにする際、インデントをつけることができます。
設定は2種類、[None] (インデントなし)と、[Indented](インデントをつける)です。初期値は [None] なので、何も設定しないと改行もインデントもなしの一行で出力されます。

[JsonConvert.SerializeObject()]メソッドの引数として設定することもできますし、JsonSerializerSettingsの中に設定することもできます。

//引数として設定
var shinobuJson = JsonConvert.SerializeObject(shinobu, Formatting.Indented);
//JsonSerializerSettingsに設定
var shinobuJson = JsonConvert.SerializeObject(shinobu, new JsonSerializerSettings() { Formatting = Formatting.Indented });

インデントをつけるつけないで、出力されるもののサイズが結構変わるので、用途に応じて利用ですね。

2. NullValueHandling

シリアライズまたはデシリアライズをする際、nullの値をどう処理するかを設定できます。
設定は2種類、[Include] (含める)と、[Ignore] (無視する)です。初期値は、[Include] です。nullの値もシリアライズされます。
[Ignore] を設定すると、nullの値は出力されません。

//JsonSerializerSettingsに設定
var shinobuJson = JsonConvert.SerializeObject(shinobu, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore });

シリアライズする際は、出力されないですが、型が決まったクラスにデシリアライズ出力すると、初期値が入ってしまいますね(そりゃそーだ)。dynamicとかだともちろんデシリアライズのときには [Ignore] されます。

3. MissingMemberHandling

デシリアライズする際に、シリアライズする側に存在するプロパティがデシリアラズする側に存在しないとExceptionを吐きます。
設定は2種類、[Ignore] (無視する)と、[Error](例外エラーを出力)です。初期値は、[Include] です。

var shinobuJson = JsonConvert.SerializeObject(shinobu, new JsonSerializerSettings() { MissingMemberHandling = MissingMemberHandling.Error });

その他

個人的におもしろそうなものとして以下をあげておきます(説明なしで雑...)。