Alternativen PropertyNamingPolicy, PropertyNameCaseInsensitive och Encoder respekteras vid serialisering och deserialisering av nyckel/värde-par
JsonSerializerrespekterar nu alternativen och Encoder när du serialiserar egenskapsnamnen Key PropertyNamingPolicy och Value för en KeyValuePair<TKey,TValue> instans. JsonSerializer Dessutom respekterar PropertyNamingPolicy alternativen och PropertyNameCaseInsensitive när instanser deserialiserasKeyValuePair<TKey,TValue>.
Ändra beskrivning
Serialization
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 egenskaperna och Value inte är kamelkadlade efter serialiseringen, även om den angivna principen för egenskapsnamngivning dikterar 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 PropertyNamingPolicy respekteras alternativen och Encoder när instanser serialiseras KeyValuePair<TKey,TValue> . 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 genereras även om en angiven egenskapsnamnsprincip 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 PropertyNamingPolicy respekteras alternativen och PropertyNameCaseInsensitive vid deserialisering med hjälp av JsonSerializer. Följande kodfragment visar till exempel lyckad deserialisering av gemener och Value egenskapsnamn Key eftersom den angivna egenskapsnamnsprincipen 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 kamel-skiftläge enligt PropertyNamingPolicy alternativet i följande kodexempel, deserialiserar 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 introducerad
5,0
Orsak till ändringen
Omfattande kundfeedback visade att bör PropertyNamingPolicy respekteras. För fullständighet PropertyNameCaseInsensitive respekteras även alternativen och Encoder så att KeyValuePair<TKey,TValue> instanser behandlas på samma sätt som andra vanliga gamla CLR-objekt (POCO).
Rekommenderad åtgärd
Om den här ändringen är störande för dig kan du använda en anpassad konverterare som implementerar önskad semantik.