Dela via


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:

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änder required 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.

Se även