Delen via


Vereiste eigenschappen

Vanaf .NET 7 kunt u bepaalde eigenschappen markeren om aan te geven dat ze aanwezig moeten zijn in de JSON-nettolading om deserialisatie te voltooien. Als een of meer van deze vereiste eigenschappen niet aanwezig zijn, werpen de JsonSerializer.Deserialize methoden een JsonException.

Er zijn drie manieren om een eigenschap of veld te markeren als vereist voor JSON-deserialisatie:

Vanuit het perspectief van de serialisatiefunctie zijn deze twee afbakeningen gelijkwaardig en beide worden toegewezen aan hetzelfde stukje metagegevens, dat wil JsonPropertyInfo.IsRequiredwel . In de meeste gevallen gebruikt u gewoon het ingebouwde C#-trefwoord. In de volgende gevallen moet u echter in plaats daarvan het volgende gebruiken JsonRequiredAttribute :

  • Als u een andere programmeertaal dan C# of een downlevel versie van C# gebruikt.
  • Als u alleen de vereiste wilt toepassen op JSON-deserialisatie.
  • Als u serialisatie gebruikt System.Text.Json in de brongeneratiemodus . In dit geval wordt uw code niet gecompileerd als u de wijzigingsfunctie gebruikt, omdat het genereren van de bron tijdens het required compileren plaatsvindt.

In het volgende codefragment ziet u een voorbeeld van een eigenschap die is gewijzigd met het required trefwoord. Deze eigenschap moet aanwezig zijn in de JSON-nettolading om deserialisatie te voltooien.

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; }
}

U kunt ook het volgende gebruiken 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; }
}

Het is ook mogelijk om te bepalen of een eigenschap is vereist via het contractmodel met behulp van de JsonPropertyInfo.IsRequired eigenschap:

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);