Freigeben über


PropertyNamingPolicy, PropertyNameCaseInsensitive und Encoder-Optionen werden beim Serialisieren und Deserialisieren von Schlüsselwertpaaren berücksichtigt.

JsonSerializer berücksichtigt nun die Optionen PropertyNamingPolicy und Encoder beim Serialisieren der Eigenschaftsnamen Key und Value einer KeyValuePair<TKey,TValue>-Instanz. Außerdem berücksichtigt JsonSerializer die Optionen PropertyNamingPolicy und PropertyNameCaseInsensitive beim Deserialisieren von KeyValuePair<TKey,TValue>-Instanzen.

Änderungsbeschreibung

Serialisierung

In den .NET Core 3.x-Versionen und den Versionen 4.6.0-4.7.2 des "System.Text.Json NuGet-Pakets" werden die Eigenschaften von Instanzen unabhängig von jeglichen KeyValuePair<TKey,TValue> und JsonSerializerOptions.PropertyNamingPolicy Optionen immer genau als "Key" und "Value" serialisiert. Im folgenden Codebeispiel wird gezeigt, wie die Eigenschaften Key und Value nach der Serialisierung nicht mit gemischter Groß-/Kleinschreibung geschrieben werden, obwohl dies von der Richtlinie für die Benennung von Eigenschaften vorgeschrieben wird.

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}

Ab .NET 5 werden die Optionen PropertyNamingPolicy und Encoder beim Serialisieren von KeyValuePair<TKey,TValue> Instanzen berücksichtigt. Im folgenden Codebeispiel wird gezeigt, wie die Eigenschaften Key und Value gemäß der Richtlinie für die Benennung von Eigenschaften nach der Serialisierung mit gemischter Groß-/Kleinschreibung geschrieben werden.

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}

Deserialisierung

In .NET Core 3.x-Versionen und in den 4.7.x-Versionen des System.Text.Json NuGet-Pakets wird ein JsonException-Fehler ausgelöst, wenn die JSON-Eigenschaftsnamen nicht genau Key sind und Value beispielsweise nicht mit einem Großbuchstaben beginnen. Die Ausnahme wird auch dann ausgelöst, wenn eine bestimmte Richtlinie zur Benennung von Eigenschaften dies ausdrücklich gestattet.

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

Ab .NET 5 werden die Optionen PropertyNamingPolicy und PropertyNameCaseInsensitive bei der Deserialisierung mithilfe von JsonSerializer berücksichtigt. Beispielsweise zeigt der folgende Codeausschnitt eine erfolgreiche Deserialisierung von kleingeschriebenen Key- und Value-Eigenschaftsnamen, da die angegebene Eigenschaftsnamenrichtlinie dies zulässt.

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

Zur Unterstützung von Nutzdaten, die mit früheren Versionen deserialisiert wurden, gilt für die Eigenschaftsnamen „Key“ und „Value“ ein Sonderfall in Bezug auf die Groß-/Kleinschreibung, um diese bei der Deserialisierung abzugleichen. Obwohl die Eigenschaftsnamen Key und Value im folgenden Codebeispiel nicht entsprechend der Option PropertyNamingPolicy mit gemischter Groß-/Kleinschreibung geschrieben werden, werden sie erfolgreich deserialisiert.

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

Eingeführte Version

5.0

Grund für Änderung

Umfassendes Kundenfeedback hat ergeben, dass die Eigenschaft PropertyNamingPolicy berücksichtigt werden sollte. Zur Vollständigkeit werden auch die Optionen PropertyNameCaseInsensitive und Encoder berücksichtigt, sodass KeyValuePair<TKey,TValue> Instanzen wie jedes andere einfache alte CLR-Objekt (POCO) behandelt werden.

Wenn diese Änderung für Sie störend ist, können Sie einen benutzerdefinierten Konverter verwenden, der die gewünschte Semantik implementiert.

Betroffene APIs