Nödvändiga egenskaper
Du kan markera vissa egenskaper för att visa att de måste finnas i JSON-nyttolasten för att deserialiseringen ska lyckas. På samma sätt kan du ange ett alternativ för att ange att alla icke-valfria konstruktorparametrar finns i JSON-nyttolasten. 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
required
modifieraren. - Genom att kommentera det med JsonRequiredAttribute.
- Genom att ändra egenskapen för JsonPropertyInfo.IsRequired kontraktsmodellen.
Om du vill ange att alla icke-valfria konstruktorparametrar krävs för JSON-deserialisering anger du JsonSerializerOptions.RespectRequiredConstructorParameters alternativet (eller, för källgenerering, RespectRequiredConstructorParameters egenskap) till true
. Mer information finns i avsnittet Icke-valfria konstruktorparametrar .
Från serialiserarens perspektiv är C# required
-modifieraren och [JsonRequired]
attributet 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.
public static void RunIt()
{
// 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:
public static void RunIt()
{
// 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:
public static void RunIt()
{
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 succeeds even though
// the Name property isn't in the JSON payload.
JsonSerializer.Deserialize<Person>("""{"Age": 42}""", options);
}
public class Person
{
public required string Name { get; set; }
public int Age { get; set; }
}
Icke-valfria konstruktorparametrar
Före .NET 9 behandlade konstruktorbaserad deserialisering alla konstruktorparametrar som valfria, vilket visas i följande exempel:
var result = JsonSerializer.Deserialize<Person>("{}");
Console.WriteLine(result); // Person { Name = , Age = 0 }
record Person(string Name, int Age);
Från och med .NET 9 kan du ange RespectRequiredConstructorParameters flaggan för att behandla icke-valfria konstruktorparametrar efter behov.
public static void RunIt()
{
JsonSerializerOptions options = new()
{
RespectRequiredConstructorParameters = true
};
string json = """{"Age": 42}""";
// The following line throws a JsonException at run time.
JsonSerializer.Deserialize<Person>(json, options);
}
record Person(string Name, int? Age = null);
Funktionsväxlare
Du kan aktivera inställningen RespectRequiredConstructorParameters
globalt med hjälp av funktionsväxeln System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault
. Lägg till följande MSBuild-objekt i projektfilen (till exempel .csproj-filen ):
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault" Value="true" />
</ItemGroup>
API:et RespectRequiredConstructorParametersDefault
implementerades som en opt-in-flagga i .NET 9 för att undvika att bryta befintliga program. Om du skriver ett nytt program rekommenderar vi starkt att du aktiverar den här flaggan i koden.