System.Text.Jsonの初期設定はstringには囲い字が必須らしい[c#][nuget]

2023-03-12
JSON処理用のライブラリについて検証してみる。
mikan-tech.info

この記事でSystem.Text.Jsonを使ってみたんだけど、Newtonsoftの方はエラーなく上手く読み込んでくれたのに、System.Text.Jsonはエラーを吐き続けました。
なんでだろう?と思って検証してみたら、囲い字が原因だった。

今回はエラーになった現象についてのお話。

エラーになった箇所

System.Text.Jsonのデシリアライズ部分。コードは上に貼った記事の中にあります。

"latitude": -85.33021

そしてこんな感じのデータを読み込もうとしました。stringで。

そしたらエラーが出ました。System.Text.JsonException、名前から疑う余地もなくSystem.Text.Jsonがエラーを吐いています。

"latitude": "-85.33021"

そして囲い字を付けたら、エラーが出なくなるという。

逆に囲い字付けたら数値型で読み込めるのか

今度は逆パターン。

"latitude": "85"

これをintとして読み込めるのかどうかを確認してみます。

無理でした!!!

"latitude": 85

囲い字をなくせばintとして問題なく読み込めるようです……。

解決策

MSDNに解決策が書いてありました!JsonSerializerOptionsをデシリアライズの引数として渡さないといけないようです。

JsonSerializerOptions.NumberHandling を WriteAsString または AllowReadingFromString に設定するか、System.Text.Json 属性を使用します。

MSDNより引用

現状Newtonsoft.Jsonであれば何もせずに読み込めるので、この設定の手間を惜しむならNewtonsoft.Jsonがオススメ。速いし。