Erforderliche Eigenschaften
Ab .NET 7 können Sie bestimmte Eigenschaften markieren, um anzugeben, dass sie in den JSON-Nutzdaten vorhanden sein müssen, damit die Deserialisierung erfolgreich ist. Wenn mindestens eine dieser erforderlichen Eigenschaften nicht vorhanden ist, lösen die JsonSerializer.Deserialize-Methoden eine JsonException aus.
Es gibt drei Möglichkeiten, eine Eigenschaft oder ein Feld als erforderlich für die JSON-Deserialisierung zu markieren:
- Durch Hinzufügen des Erforderlich-Modifizierers, der in C# 11 neu ist.
- Durch Kommentieren mit JsonRequiredAttribute, das in .NET 7 neu ist.
- Durch Ändern der JsonPropertyInfo.IsRequired-Eigenschaft des Vertragsmodells, die in .NET 7 neu ist.
Aus der Perspektive des Serialisierers sind diese beiden Kennzeichnungen gleichwertig und werden demselben Metadatenelement zugeordnet, nämlich JsonPropertyInfo.IsRequired. In den meisten Fällen verwenden Sie einfach das integrierte C#-Schlüsselwort. In den folgenden Fällen sollten Sie stattdessen jedoch JsonRequiredAttribute verwenden:
- Wenn Sie eine andere Programmiersprache als C# oder eine untergeordnete Version von C# verwenden.
- Wenn Sie möchten, dass die Anforderung nur auf die JSON-Deserialisierung angewendet werden soll.
- Wenn Sie die
System.Text.Json
-Serialisierung im Quellgenerierungsmodus verwenden. In diesem Fall lässt sich Ihr Code nicht kompilieren, wenn Sie denrequired
-Modifizierer verwenden, da die Quellgenerierung zur Kompilierzeit erfolgt.
Das folgende Codeschnipsel zeigt ein Beispiel für eine Eigenschaft, die mit dem Schlüsselwort required
geändert wurde. Diese Eigenschaft muss in den JSON-Nutzdaten vorhanden sein, damit die Deserialisierung erfolgreich ist.
using System.Text.Json;
// The following line throws a JsonException at run time.
Console.WriteLine(JsonSerializer.Deserialize<Person>("""{"Age": 42}"""));
public class Person
{
public required string Name { get; set; }
public int Age { get; set; }
}
Alternativ kannst du auch JsonRequiredAttribute verwenden:
using System.Text.Json;
// The following line throws a JsonException at run time.
Console.WriteLine(JsonSerializer.Deserialize<Person>("""{"Age": 42}"""));
public class Person
{
[JsonRequired]
public string Name { get; set; }
public int Age { get; set; }
}
Ferner kann auch über das Vertragsmodell unter Verwendung der Eigenschaft JsonPropertyInfo.IsRequired gesteuert werden, ob eine Eigenschaft erforderlich ist:
var options = new JsonSerializerOptions
{
TypeInfoResolver = new DefaultJsonTypeInfoResolver
{
Modifiers =
{
static typeInfo =>
{
if (typeInfo.Kind != JsonTypeInfoKind.Object)
return;
foreach (JsonPropertyInfo propertyInfo in typeInfo.Properties)
{
// Strip IsRequired constraint from every property.
propertyInfo.IsRequired = false;
}
}
}
}
};
// Deserialization now succeeds even though the Name property isn't in the JSON payload.
JsonSerializer.Deserialize<Person>("""{"Age": 42}""", options);
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Einreichen und Feedback anzeigen für