Condividi tramite


Le opzioni PropertyNamingPolicy, PropertyNameCaseInsensitive e Encoder vengono rispettate durante la serializzazione e la deserializzazione di coppie chiave-valore

JsonSerializer ora onora le opzioni PropertyNamingPolicy e Encoder quando serializza i nomi delle proprietà Key e Value di un'istanza KeyValuePair<TKey,TValue>. Inoltre, JsonSerializer rispetta le opzioni PropertyNamingPolicy e PropertyNameCaseInsensitive durante la deserializzazione delle istanze KeyValuePair<TKey,TValue>.

Descrizione delle modifiche

Serializzazione

Nelle versioni di .NET Core 3.x e nelle versioni 4.6.0-4.7.2 del pacchetto NuGet System.Text.Json, le proprietà delle istanze KeyValuePair<TKey,TValue> sono serializzate sempre esattamente come "Key" e "Value", indipendentemente da qualsiasi opzione JsonSerializerOptions.PropertyNamingPolicy e JsonSerializerOptions.Encoder. Nell'esempio di codice seguente viene illustrato come le proprietà Key e Valuenon siano in camel case dopo la serializzazione, anche se la politica di denominazione delle proprietà specificata lo richiede.

var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
KeyValuePair<int, int> kvp = KeyValuePair.Create(1, 1);
Console.WriteLine(JsonSerializer.Serialize(kvp, options));
// Expected: {"key":1,"value":1}
// Actual: {"Key":1,"Value":1}

A partire da .NET 5, le opzioni PropertyNamingPolicy e Encoder vengono rispettate durante la serializzazione delle istanze KeyValuePair<TKey,TValue>. Nell'esempio di codice seguente viene illustrato come le proprietà Key e Value vengano trasformate in camel case dopo la serializzazione, in accordo con la politica di denominazione delle proprietà specificata.

var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
KeyValuePair<int, int> kvp = KeyValuePair.Create(1, 1);
Console.WriteLine(JsonSerializer.Serialize(kvp, options));
// {"key":1,"value":1}

Deserializzazione

Nelle versioni di .NET Core 3.x e nelle versioni 4.7.x del pacchetto NuGet System.Text.Json viene generata un'eccezione JsonException quando i nomi delle proprietà JSON non sono precisamente Key e Value, ad esempio, se non iniziano con una lettera maiuscola. L'eccezione viene generata anche se un criterio di denominazione delle proprietà specificato lo consente espressamente.

var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = @"{""key"":1,""value"":1}";
// Throws JsonException.
JsonSerializer.Deserialize<KeyValuePair<int, int>>(json, options);

A partire da .NET 5, le opzioni PropertyNamingPolicy e PropertyNameCaseInsensitive vengono rispettate durante la deserializzazione tramite JsonSerializer. Ad esempio, il frammento di codice seguente mostra la deserializzazione corretta dei nomi di proprietà minuscoli Key e Value perché i criteri di denominazione delle proprietà specificati lo consentono.

var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = @"{""key"":1,""value"":1}";

KeyValuePair<int, int> kvp = JsonSerializer.Deserialize<KeyValuePair<int, int>>(json);
Console.WriteLine(kvp.Key); // 1
Console.WriteLine(kvp.Value); // 1

Per garantire la compatibilità con i payload serializzati con le versioni precedenti, "Key" e "Value" vengono trattati in modo speciale durante la deserializzazione. Anche se i nomi delle proprietà Key e Value non sono scritti in camel case secondo l'opzione PropertyNamingPolicy nell'esempio di codice seguente, si deserializzano con successo.

var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = @"{""Key"":1,""Value"":1}";

KeyValuePair<int, int> kvp = JsonSerializer.Deserialize<KeyValuePair<int, int>>(json);
Console.WriteLine(kvp.Key); // 1
Console.WriteLine(kvp.Value); // 1

Versione introdotta

5.0

Motivo della modifica

Un feedback sostanziale dei clienti ha indicato che l'oggetto PropertyNamingPolicy deve essere rispettato. Per completezza, vengono rispettate anche le opzioni PropertyNameCaseInsensitive e Encoder, in modo che le istanze KeyValuePair<TKey,TValue> vengano considerate uguali a qualsiasi altro oggetto CLR (POCO) tradizionale.

Se questa modifica comporta interruzioni, è possibile usare un convertitore personalizzato che implementa la semantica desiderata.

Le API interessate