Les applications ASP.NET Core autorisent la désérialisation des nombres entre guillemets

À compter de .NET 5, les applications ASP.NET Core utilisent les options de désérialisation par défaut spécifiées par JsonSerializerDefaults.Web. L’ensemble d’options Web inclut le paramètre NumberHandling sur JsonNumberHandling.AllowReadingFromString. Ce changement signifie que les applications ASP.NET Core désérialisent correctement les nombres représentés sous forme de chaînes JSON au lieu de lever une exception.

Description de la modification

Dans .NET Core 3.0 - 3.1, JsonSerializer lève une JsonException pendant la désérialisation s’il rencontre un nombre entre guillemets dans une charge utile JSON. Les nombres entre guillemets sont utilisés pour mapper avec les propriétés numériques dans les graphiques d’objets. Dans .NET Core 3.0 - 3.1, les nombres sont uniquement lus à partir des jetons JsonTokenType.Number.

À compter de .NET 5, les nombres entre guillemets dans les charges utiles JSON sont considérés comme valides, par défaut, pour les applications ASP.NET Core. Aucune exception n’est levée lors de la désérialisation des nombres entre guillemets.

Conseil

  • Il n’y a aucun changement de comportement pour la valeur par défaut, JsonSerializer autonome ou JsonSerializerOptions.
  • Techniquement, il ne s’agit pas d’un changement cassant, car il rend un scénario plus permissif au lieu d’être plus restrictif (autrement dit, il réussit à contraindre un nombre à partir d’une chaîne JSON au lieu de lever une exception). Toutefois, étant donné qu’il s’agit d’un changement de comportement significatif qui affecte de nombreuses applications ASP.NET Core, il est documenté ici.
  • Les méthodes d’extension HttpClientJsonExtensions.GetFromJsonAsync et HttpContentJsonExtensions.ReadFromJsonAsync utilisent également l’ensemble Web des options de sérialisation.

Version introduite

5,0

Raison du changement

Plusieurs utilisateurs ont demandé une option pour une gestion des nombres plus permissive dans JsonSerializer. Ces commentaires indiquent que de nombreux producteurs JSON (par exemple, des services sur le web) émettent des nombres entre guillemets. En autorisant la lecture (désérialisation) des nombres entre guillemets, les applications .NET peuvent analyser correctement ces charges utiles, par défaut, dans des contextes web. La configuration est exposée via JsonSerializerDefaults.Web afin que vous puissiez spécifier les mêmes options sur différentes couches d’application, par exemple, cliente, serveur et partagée.

Si ce changement est perturbateur, par exemple, si vous dépendez de la gestion stricte des nombres pour la validation, vous pouvez réactiver le comportement précédent. Définissez l'option JsonSerializerOptions.NumberHandling sur JsonNumberHandling.Strict.

Pour les applications API web et MVC ASP.NET Core, vous pouvez configurer l’option dans Startup à l’aide du code suivant :

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

API affectées