PropertyNamingPolicy, PropertyNameCaseInsensitive i Opcje kodera są honorowane podczas serializacji i deserializacji par klucz-wartość
JsonSerializerteraz honoruje PropertyNamingPolicy opcje i Encoder podczas serializacji Key nazw KeyValuePair<TKey,TValue> właściwości i Value wystąpienia. JsonSerializer Ponadto honoruje PropertyNamingPolicy opcje i PropertyNameCaseInsensitive podczas deserializacji KeyValuePair<TKey,TValue> wystąpień.
Opis zmiany
Serializacja
W wersjach .NET Core 3.x i w wersjach 4.6.0-4.7.2 pakietu NuGet System.Text.Json właściwości KeyValuePair<TKey,TValue> wystąpień są zawsze serializowane jako "Klucz" i "Wartość", niezależnie od wszystkich JsonSerializerOptions.PropertyNamingPolicy opcji iJsonSerializerOptions.Encoder. W poniższym przykładzie kodu pokazano, jak Key właściwości i Value nie są wielbłądne po serializacji, mimo że określone zasady nazewnictwa właściwości tak dyktują.
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}
Począwszy od platformy .NET 5, PropertyNamingPolicy opcje i Encoder są honorowane podczas serializacji KeyValuePair<TKey,TValue> wystąpień. W poniższym przykładzie kodu pokazano, jak Key właściwości i Value są wielbłądne po serializacji, zgodnie z określonymi zasadami nazewnictwa właściwości.
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}
Deserializacji
W wersjach .NET Core 3.x i w wersjach 4.7.x pakietu NuGet System.Text.Json jest zgłaszany, JsonException gdy nazwy właściwości JSON nie są dokładnie Key
i Value
, na przykład, jeśli nie zaczynają się od wielkiej litery. Wyjątek jest zgłaszany, nawet jeśli określone zasady nazewnictwa właściwości wyraźnie go zezwalają.
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = @"{""key"":1,""value"":1}";
// Throws JsonException.
JsonSerializer.Deserialize<KeyValuePair<int, int>>(json, options);
Począwszy od platformy .NET 5, PropertyNamingPolicy opcje i PropertyNameCaseInsensitive są honorowane podczas deserializacji przy użyciu polecenia JsonSerializer. Na przykład poniższy fragment kodu pokazuje pomyślną deserializacji małych liter Key i Value nazw właściwości, ponieważ określone zasady nazewnictwa właściwości zezwalają na to.
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
Aby pomieścić ładunki, które zostały serializowane z poprzednimi wersjami, "Klucz" i "Wartość" są specjalnie dopasowane w przypadku deserializacji. Mimo że Key nazwy właściwości i Value nie są wielbłądowane zgodnie z opcją PropertyNamingPolicy w poniższym przykładzie kodu, deserializuje się pomyślnie.
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
Wprowadzona wersja
5,0
Przyczyna wprowadzenia zmiany
Znaczna opinia klientów wskazała PropertyNamingPolicy , że powinien zostać uhonorowany. W przypadku kompletności PropertyNameCaseInsensitive opcje i Encoder są również honorowane, dzięki czemu KeyValuePair<TKey,TValue> wystąpienia są traktowane tak samo jak każdy inny zwykły stary obiekt CLR (POCO).
Zalecana akcja
Jeśli ta zmiana jest dla Ciebie destrukcyjna, możesz użyć konwertera niestandardowego, który implementuje żądaną semantyka.