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 niewielbłą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).

Jeśli ta zmiana jest dla Ciebie destrukcyjna, możesz użyć konwertera niestandardowego, który implementuje żądaną semantyka.

Dotyczy interfejsów API