Delen via


Vereiste eigenschappen

U kunt bepaalde eigenschappen markeren om aan te geven dat ze aanwezig moeten zijn in de JSON-nettolading om deserialisatie te voltooien. U kunt ook een optie instellen om op te geven dat alle niet-optionele constructorparameters aanwezig zijn in de JSON-nettolading. 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:

Als u wilt opgeven dat alle niet-optionele constructorparameters vereist zijn voor JSON-deserialisatie, stelt u de JsonSerializerOptions.RespectRequiredConstructorParameters optie (of, voor het genereren van de bron, RespectRequiredConstructorParameters eigenschap) in op true. Zie de sectie Niet-optionele constructorparameters voor meer informatie.

Vanuit het perspectief van de serialisatiefunctie zijn de C# required -modifier en [JsonRequired] het kenmerk equivalent, en beide worden toegewezen aan hetzelfde stukje metagegevens, namelijk JsonPropertyInfo.IsRequired. 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.

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

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

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

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

Niet-optionele constructorparameters

Vóór .NET 9 behandelde constructorgebaseerde deserialisatie alle constructorparameters als optioneel, zoals in het volgende voorbeeld wordt weergegeven:

var result = JsonSerializer.Deserialize<Person>("{}");
Console.WriteLine(result); // Person { Name = , Age = 0 }

record Person(string Name, int Age);

Vanaf .NET 9 kunt u de RespectRequiredConstructorParameters vlag zo instellen dat niet-optionele constructorparameters naar behoefte worden behandeld.

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

Functieschakelaar

U kunt de RespectRequiredConstructorParameters instelling globaal inschakelen met behulp van de System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault functieschakelaar. Voeg het volgende MSBuild-item toe aan uw projectbestand (bijvoorbeeld .csproj-bestand ):

<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault" Value="true" />
</ItemGroup>

De RespectRequiredConstructorParametersDefault API is geïmplementeerd als een opt-in-vlag in .NET 9 om te voorkomen dat bestaande toepassingen worden onderbroken. Als u een nieuwe toepassing schrijft, is het raadzaam deze vlag in te schakelen in uw code.

Zie ook