ASP.NET Core アプリで、引用符で囲まれた数値を逆シリアル化できる

.NET 5 以降では、ASP.NET Core アプリによって、JsonSerializerDefaults.Web で指定された既定の逆シリアル化オプションが使用されます。 Web オプション セットには、JsonNumberHandling.AllowReadingFromStringへの NumberHandling の設定が含まれます。 この変更は、例外がスローされるのではなく、JSON 文字列として表される数値が ASP.NET Core アプリによって正常に逆シリアル化されることを意味します。

変更内容

.NET Core 3.0 から 3.1 では、JSON ペイロードで引用符で囲まれた数値が検出された場合、逆シリアル化中に JsonSerializer によって JsonException がスローされます。 引用符で囲まれた数値は、オブジェクト グラフの数値プロパティとマップするために使用されます。 .NET Core 3.0 から 3.1 では、数値は JsonTokenType.Number トークンからのみ読み取られます。

.NET 5 以降では、JSON ペイロードの引用符で囲まれた数値は、既定で ASP.NET Core アプリに対して有効と見なされます。 引用符で囲まれた数値の逆シリアル化中に例外はスローされません。

ヒント

  • 既定のスタンドアロンの JsonSerializerJsonSerializerOptions の動作変更はありません。
  • これは厳密には破壊的変更ではありません。これにより、シナリオがより制限の厳しいものになるのではなく、より制限の少ないものになるためです (つまり、例外をスローするのではなく、JSON 文字列からの数値の強制変換が正常に行われます)。 しかし、これは多くの ASP.NET Core アプリに影響する重要な動作変更であるため、ここに記載されています。
  • HttpClientJsonExtensions.GetFromJsonAsync および HttpContentJsonExtensions.ReadFromJsonAsync 拡張メソッドで Web シリアル化オプション セットも使用されます。

導入されたバージョン

5.0

変更理由

複数のユーザーから、JsonSerializer でのより制限の少ない数値処理のためのオプションを求められました。 このフィードバックは、多くの JSON プロデューサー (たとえば、Web 全体のサービス) によって引用符で囲まれた数値が生成されることを示しています。 引用符で囲まれた数値の読み取り (逆シリアル化) を許可することにより、.NET アプリでこれらのペイロードを既定で Web コンテキストで正常に解析できます。 この構成は JsonSerializerDefaults.Web を介して公開されるので、クライアント、サーバー、および共有など、異なるアプリケーション層全体で同じオプションを指定することができます。

この変更が破壊的なものである場合、たとえば、検証のために厳密な数値の処理に依存している場合は、以前の動作を再び有効にすることができます。 JsonSerializerOptions.NumberHandling オプションを JsonNumberHandling.Strict に設定します。

ASP.NET Core MVC および Web API アプリの場合は、次のコードを使用して Startup でオプションを構成できます。

services.AddControllers()
   .AddJsonOptions(options => options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.Strict);

影響を受ける API