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:

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

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