Neu in .NET 10.0 [34]: Keine doppelten Attributwerte bei JSON-Deserialisierung
Die neue Einstellung "AllowDuplicateProperties = false" löst bei doppelten Werten in der JSON-Deserialisierung einen Laufzeitfehler aus.
(Bild: Pincasso / Shutterstock.com)
- Dr. Holger Schwichtenberg
Die JSON-Bibliothek System.Text.Json war bisher sehr tolerant bei der Deserialisierung von doppelten Attributwerten.
Der folgende Programmcode fĂĽhrt bisher und auch im Standard System.Text.Json in .NET 10.0 nicht zu einem Laufzeitfehler:
string json = """{ "FirstName": "Holger", "LastName": "Schwichtenberg", "LastName": "www.IT-Visions.de" }""";
Console.WriteLine(json);
CUI.H2("Deserialisierung im Standard");
var person = JsonSerializer.Deserialize<Person>(json);
Console.WriteLine(person);
In diesem Beispiel wird "LastName" zweimal gesetzt: einmal auf den Nachnamen und fälschlicherweise ein zweites Mal auf eine Website-URL. Dabei verwendet der JSON-Serializer immer den letzten Wert, das heißt, die Ausgabe ist nicht „Person: Holger Schwichtenberg“, sondern „Person: Holger www.IT-Visions.de“.
(Bild:Â King / stock.adobe.com)
Das ist neu in .NET 11.0: Dr. Holger Schwichtenberg und weitere Experten präsentieren am 17. November 2026 auf der Online-Konferenz betterCode() .NET 11.0 die Änderungen für Entwicklerinnen und Entwickler. Tickets zum Frühbucherpreis sind im Online-Shop verfügbar.
In System.Text.Json gibt es seit .NET 10.0 Preview 6 bei den JsonSerializerOptions eine neue Eigenschaft AllowDuplicateProperties. Diese hat im Standard den Wert true. Mit der Umstellung auf false erreicht man, dass beim Deserialisieren von JSON-Dokumenten ein Laufzeitfehler entsteht, falls ein Attribut mehrfach gesetzt wird.
Videos by heise
Mit AllowDuplicateProperties = false fĂĽhrt diese Situation zu dem Laufzeitfehler
Duplicate property 'LastName' encountered during deserialization
sowohl beim Aufruf der Methode Deserialize() als auch beim Aufruf der Methode Parse().
Folgender Beispielcode nutzt AllowDuplicateProperties = false:
try
{
CUI.H2("Deserialisierung mit AllowDuplicateProperties = false");
JsonSerializerOptions options = new() { AllowDuplicateProperties = false };
JsonSerializer.Deserialize<Person>(json, options); // JsonException
}
catch (Exception ex)
{
CUI.PrintError(ex);
}
try
{
CUI.H2("Parse mit AllowDuplicateProperties = false");
JsonDocumentOptions docOptions = new() { AllowDuplicateProperties = false };
JsonDocument.Parse(json, docOptions); // throws JsonException
}
catch (Exception ex)
{
CUI.PrintError(ex);
}
(rme)