Поделиться через


Приложения ASP.NET Core поддерживают десериализацию заключенных в кавычки чисел

Начиная с версии .NET 5 приложения ASP.NET Core используют параметры десериализации по умолчанию, которые задаются в JsonSerializerDefaults.Web. Набор параметров Web включает параметр NumberHandling для JsonNumberHandling.AllowReadingFromString. Это изменение означает, что приложения ASP.NET Core будут успешно выполнять десериализацию чисел, представленных в виде строк JSON, вместо того, чтобы создавать исключение.

Описание изменения

В .NET Core версий с 3.0 по 3.1 JsonSerializer во время десериализации вызывает исключение JsonException, если в полезных данных JSON обнаруживается число в кавычках. Заключенные в кавычки числа используются для сопоставления с числовыми свойствами в графах объектов. В .NET Core версий с 3.0 по 3.1 числа считываются только из токенов JsonTokenType.Number.

Начиная с версии .NET 5 заключенные в кавычки числа в полезных данных JSON считаются допустимыми по умолчанию для приложений ASP.NET Core. Во время десериализации заключенных в кавычки чисел исключение не создается.

Совет

  • При этом не изменяется поведение для заданного по умолчанию изолированного JsonSerializer или JsonSerializerOptions.
  • С технической точки зрения это изменение не является критическим, поскольку оно снижает, а не повышает степень строгости сценария (т. е. в результате этого изменения приведение числа из строки JSON завершается успешно и не приводит к созданию исключения). Тем не менее, это изменение поведения является существенным и затрагивает многие приложения ASP.NET Core, в связи с чем мы приводим его описание.
  • Методы расширения HttpClientJsonExtensions.GetFromJsonAsync и HttpContentJsonExtensions.ReadFromJsonAsync также используют набор параметров сериализации Web.

Представленные версии

5,0

Причина изменения

Несколько пользователей запросили возможность менее ограничивающей обработки чисел в JsonSerializer. Это указывает на то, что многие поставщики объектов JSON (например, служб в Интернете) используют заключенные в кавычки числа. Поддержка чтения (десериализации) заключенных в кавычки чисел в приложениях .NET позволяет по умолчанию успешно анализировать эти полезные данные в веб-контексте. Эта конфигурация предоставляется с помощью JsonSerializerDefaults.Web, что позволяет указывать одни и те же параметры на разных уровнях приложения, например для клиента, сервера и общедоступного уровня.

Если это изменение приводит к нарушениям в работе, например, если в вашем приложении используется строгая обработка чисел для проверки, вы можете включить предыдущее поведение. Присвойте параметру JsonSerializerOptions.NumberHandling значение JsonNumberHandling.Strict.

Для приложений MVC и приложений веб-API ASP.NET Core этот параметр можно настроить в Startup с помощью следующего кода:

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

Затронутые API