Le app ASP.NET Core consentono la deserializzazione dei numeri tra virgolette

A partire da .NET 5, le app ASP.NET Core usano le opzioni di deserializzazione predefinite specificate da JsonSerializerDefaults.Web. Il set Web di opzioni include l'impostazione di NumberHandling su JsonNumberHandling.AllowReadingFromString. Questa modifica significa che le app ASP.NET Core deserializzano correttamente i numeri rappresentati come stringhe JSON anziché generare un'eccezione.

Descrizione delle modifiche

In .NET Core 3.0 - 3.1 JsonSerializer genera un'eccezione JsonException durante la deserializzazione, se rileva un numero tra virgolette in un payload JSON. I numeri tra virgolette vengono usati per eseguire il mapping con le proprietà dei numeri nei grafici di oggetti. In .NET Core 3.0 - 3.1 i numeri vengono letti solo dai token JsonTokenType.Number.

A partire da .NET 5, i numeri tra virgolette nei payload JSON sono considerati validi, per impostazione predefinita, per le app ASP.NET Core. Non viene generata alcuna eccezione durante la deserializzazione dei numeri tra virgolette.

Suggerimento

  • Nessuna modifica funzionale per l'impostazione predefinita e autonoma JsonSerializer o JsonSerializerOptions.
  • Tecnicamente non si tratta di una modifica che causa un'interruzione, poiché rende uno scenario più permissivo anziché più restrittivo (vale a dire, riesce a ottenere di un numero da una stringa JSON anziché generare un'eccezione). Tuttavia, poiché si tratta di una modifica funzionale significativa che influisce su molte app ASP.NET Core, è documentata qui.
  • I metodi di estensione HttpClientJsonExtensions.GetFromJsonAsync e HttpContentJsonExtensions.ReadFromJsonAsync usano anche il set Web di opzioni di serializzazione.

Versione introdotta

5.0

Motivo della modifica

Diversi utenti hanno richiesto un'opzione per una gestione più permissiva dei numeri in JsonSerializer. Questo feedback indica che molti produttori JSON(ad esempio, servizi sul Web) generano numeri tra virgolette. Consentendo la lettura dei numeri tra virgolette (deserializzati), le app .NET possono analizzare correttamente questi payload, per impostazione predefinita, nei contesti Web. La configurazione viene esposta tramite JsonSerializerDefaults.Web, perciò puoi specificare le stesse opzioni su diversi livelli dell'applicazione, ad esempio client, server e in condivisione.

Se nel tuo caso questa modifica è problematica, ad esempio, se dipendi dalla gestione rigorosa dei numeri per la convalida, puoi riabilitare il comportamento precedente. Imposta l'opzione JsonSerializerOptions.NumberHandling su JsonNumberHandling.Strict.

Per le app API Web e MVC ASP.NET Core, puoi configurare l'opzione in Startup usando il codice seguente:

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

API interessate