C#

[C#]Json.NETで生成されるJsonを編集する

投稿日:

Json.NET その2

ThinkAbout関連画像

では、今回も引き続き、Json.NETをテーマにやっていきます!

1.クラスのプロパティ名を任意の文字列へ変換

前回、紹介した方法は良くも悪くも、クラスをそのままの形でJsonへ変換していました。
しかし、要件によってはそのまま出力してしまうと、都合が悪い場合があります。

特にプロパティ名がそのまま出力されてしまっては、受け取り側が値を解釈できないなんて、場合もあります。

逆に言えば、プロパティ名を変更すれば出力されるプロパティ名も変わるわけです。
ただ、「コード規約を破ぶるのは嫌だ!!」という人もいると思いますので、
そういう人は対象のプロパティに指定の属性を付与することで、出力される文字列を変更することができます。

属性を指定した変換

 

Json出力

{"SampleTest1":"test","SampleTest2":1234,"SampleTest3":"2018-09-24T06:34:59.4646912Z"}

JsonProperty属性を指定し、変換したい文字列を渡しておくことで、プロパティ名を変えずに出力結果を変えることができます。

2.カスタムリゾルバを作成し文字列を変換する

先ほどの属性を付与するやり方は、変換方法がパターン化されていない場合や、属性を付与することができるクラスに関しては有効です。

しかし、変換方法がパターン化されている場合は少し効率が悪いやり方になります。
また、自動生成されたPOCOクラスなどに対しては、属性を付与することがあまり好まれないケースもあるので、そういった場合はカスタムリゾルバを使用します。

Json出力

{
"StringValue": "test",
"IntValue": 1234,
"Datevalue": "2018-09-24T17:19:55.5557552+09:00",
"P": true
}

DefaultContractResolverを継承したカスタムリゾルバクラスを作成します。
Json生成時にこのカスタムリゾルバが、プロパティ名変換を仲介することで、プロパティ名を指定文字列へ変換することができます。

デメリットとして挙げられるのは、出力用に文字列を変換しているため、受け取り側が元のクラスへと変換することができません。
使用場面としては、外部IFにJsonを出力形式として使用したい場合などは有効な手段となります。

3.値のフォーマットを変換する

今までは、プロパティ側の出力文字列を変換していましたが、最後は値側の出力に着目してみます。
今までの、Json出力結果を見ていて気が付いた人もいるかと思いますが、DateTime型の出力文字列を見てください。

Json出力

"Datevalue": "2018-09-24T17:19:55.5557552+09:00" (DateTime.Nowで出力)
"UtcDateValue":"2018-09-24T06:34:59.4646912Z" (DateTime.UtcNowで出力)

表記が異なっていることがわかります。
これも受け取り側が値として、認識できない原因になりかねません。

この問題は IsoDateTimeConverter 使用することが解決することができます。
IsoDateTimeConverter は Newtonsoft.Json.Convertersの名前空間に存在しているので、まずはUsingディレクティブに Newtonsoft.Json.Converters を追加します。

Json出力

{
"DateTime": "2018/50/24 22:50:16.561",
"UtcDateTime": "2018/50/24 13:50:16.563"
}

こんな感じで、フォーマットを変換することができます。

はい、それでは今日はここまでです!
まだ、個人的に書き足りないので、まだJson.NETは続くと思いますw

それでは、また次回!

  • この記事を書いた人

@EaE

ぬこ様とC#をこよなく愛する27歳です. 医療:理学療法士から、IT:システムエンジニアへ華麗?な変身をとげました. サーバーサイドエンジニアとして、日々奮闘しています. 今年の目標は、頑張ってWebサービスを作ります!!

-C#

Copyright© Developer Wall - 開発の壁 - , 2019 All Rights Reserved Powered by AFFINGER5.