Nödvändiga egenskaper
Från och med .NET 7 kan du markera vissa egenskaper för att visa att de måste finnas i JSON-nyttolasten för att deserialiseringen ska lyckas. Om en eller flera av dessa obligatoriska egenskaper inte finns, JsonSerializer.Deserialize genererar metoderna en JsonException.
Det finns tre sätt att markera en egenskap eller ett fält som krävs för JSON-deserialisering:
- Genom att lägga till den nödvändiga modifieraren, som är ny i C# 11.
- Genom att kommentera det med JsonRequiredAttribute, som är nytt i .NET 7.
- Genom att ändra egenskapen för JsonPropertyInfo.IsRequired kontraktsmodellen, som är ny i .NET 7.
Ur serialiserarens perspektiv är dessa två avgränsningar likvärdiga och båda mappar till samma metadata, som är JsonPropertyInfo.IsRequired. I de flesta fall använder du bara det inbyggda C#-nyckelordet. I följande fall bör du dock använda JsonRequiredAttribute i stället:
- Om du använder ett annat programmeringsspråk än C# eller en lägre version av C#.
- Om du bara vill att kravet ska gälla för JSON-deserialisering.
- Om du använder
System.Text.Json
serialisering i källgenereringsläge . I det här fallet kompileras inte koden om du använderrequired
modifieraren, eftersom källgenereringen sker vid kompileringstillfället.
Följande kodfragment visar ett exempel på en egenskap som ändrats med nyckelordet required
. Den här egenskapen måste finnas i JSON-nyttolasten för att deserialiseringen ska lyckas.
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; }
}
Du kan också använda JsonRequiredAttribute:
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; }
}
Det går också att kontrollera om en egenskap krävs via kontraktsmodellen med hjälp av JsonPropertyInfo.IsRequired egenskapen:
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.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för