Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
Azione consigliata
Se questa modifica comporta interruzioni, è possibile usare un convertitore personalizzato che implementa la semantica desiderata.