Wymagane właściwości

Począwszy od platformy .NET 7, można oznaczyć pewne właściwości, aby oznaczać, że muszą one znajdować się w ładunku JSON, aby deserializacja zakończyła się pomyślnie. Jeśli co najmniej jedna z tych wymaganych właściwości nie jest obecna, JsonSerializer.Deserialize metody zgłaszają JsonExceptionwartość .

Istnieją trzy sposoby oznaczania właściwości lub pola zgodnie z wymaganiami deserializacji JSON:

Z perspektywy serializatora te dwa demarkacje są równoważne, a obie są mapowane na ten sam fragment metadanych, czyli JsonPropertyInfo.IsRequired. W większości przypadków wystarczy użyć wbudowanego słowa kluczowego języka C#. Jednak w następujących przypadkach należy użyć zamiast JsonRequiredAttribute tego:

  • Jeśli używasz języka programowania innego niż C# lub starszej wersji języka C#.
  • Jeśli chcesz zastosować tylko wymaganie dotyczące deserializacji JSON.
  • Jeśli używasz System.Text.Json serializacji w trybie generowania źródła. W takim przypadku kod nie zostanie skompilowany, jeśli używasz required modyfikatora, ponieważ generowanie źródła występuje w czasie kompilacji.

Poniższy fragment kodu przedstawia przykład właściwości zmodyfikowanej za pomocą słowa kluczowego required . Ta właściwość musi znajdować się w ładunku JSON, aby deserializacja powiodła się.

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

Alternatywnie możesz użyć polecenia 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; }
}

Istnieje również możliwość kontrolowania, czy właściwość jest wymagana za pośrednictwem modelu kontraktu JsonPropertyInfo.IsRequired przy użyciu właściwości :

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