Alternativen PropertyNamingPolicy, PropertyNameCaseInsensitive och Encoder respekteras vid serialisering och deserialisering av nyckel/värde-par

JsonSerializer respekterar nu PropertyNamingPolicy och Encoder alternativen när Key och Value egenskapsnamnen i en KeyValuePair<TKey,TValue>-instans serialiseras. Dessutom hedrar JsonSerializer alternativen PropertyNamingPolicy och PropertyNameCaseInsensitive när KeyValuePair<TKey,TValue>-instanser deserialiseras.

Ändra beskrivning

Serialisering

I .NET Core 3.x-versioner och i 4.6.0-4.7.2-versionerna av NuGet-paketet System.Text.Json serialiseras egenskaperna KeyValuePair<TKey,TValue> för instanser alltid som "Nyckel" och "Värde" exakt, oavsett val JsonSerializerOptions.PropertyNamingPolicy och JsonSerializerOptions.Encoder alternativ. I följande kodexempel visas hur Key och Value egenskaperna inte är skrivna med kamelnotation efter serialisering, även om den angivna principen för egenskapsnamngivning föreskriver detta.

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}

Från och med .NET 5 beaktas alternativen PropertyNamingPolicy och Encoder när instanser av KeyValuePair<TKey,TValue> serialiseras. Följande kodexempel visar hur Key egenskaperna och Value är kamelkadlade efter serialiseringen, i enlighet med den angivna principen för egenskapsnamngivning.

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}

Deserialisering

I .NET Core 3.x-versioner och i 4.7.x-versionerna av NuGet-paketet System.Text.Json genereras en JsonException när JSON-egenskapsnamnen inte är exakt Key och Value, till exempel om de inte börjar med en versal bokstav. Undantaget kastas även om en angiven namngivningsprincip för egenskaper uttryckligen tillåter det.

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

Från och med .NET 5 respekteras alternativen PropertyNamingPolicy och PropertyNameCaseInsensitive vid deserialisering med JsonSerializer. Till exempel visar följande kodfragment en lyckad deserialisering av gemener i egenskapsnamn Key och Value eftersom den angivna egenskapsnamnspolicyn tillåter det.

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

För att hantera nyttolaster som serialiserades med tidigare versioner är "Key" och "Value" specialfall som matchar vid deserialisering. Även om egenskapsnamnen Key och Value inte är i camel-case enligt alternativ PropertyNamingPolicy i följande kodexempel, deserialiseras de framgångsrikt.

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

Version lanserad

5,0

Orsak till ändring

Omfattande kundfeedback visade att PropertyNamingPolicy bör respekteras. För att vara heltäckande respekteras även alternativen PropertyNameCaseInsensitive och Encoder, så att KeyValuePair<TKey,TValue> instanser behandlas på samma sätt som andra vanliga gamla CLR-objekt (POCO).

Om den här ändringen är störande för dig kan du använda en anpassad konverterare som implementerar önskad semantik.

Berörda API:er