Sdílet prostřednictvím


Požadované vlastnosti

Počínaje rozhraním .NET 7 můžete označit určité vlastnosti, které značí, že musí být k dispozici v datové části JSON, aby bylo možné provést deserializaci. Pokud některé z těchto požadovaných vlastností nejsou přítomny JsonSerializer.Deserialize , metody vyvolá výjimku JsonException.

Existují tři způsoby, jak označit vlastnost nebo pole jako povinné pro deserializaci JSON:

  • Přidáním požadovaného modifikátoru, který je v jazyce C# 11 nový.
  • Tím, že ji označíte poznámkou JsonRequiredAttribute, která je v .NET 7 nová.
  • Úpravou vlastnosti modelu kontraktu JsonPropertyInfo.IsRequired , který je nový v .NET 7.

Z pohledu serializátoru jsou tyto dvě demarace ekvivalentní a oba mapují na stejnou část metadat, což je JsonPropertyInfo.IsRequired. Ve většině případů byste jednoduše použili integrované klíčové slovo jazyka C#. V následujících případech byste ale měli místo toho použít JsonRequiredAttribute :

  • Pokud používáte jiný programovací jazyk než C# nebo nižší verzi jazyka C#.
  • Pokud chcete, aby se požadavek použil pouze na deserializaci JSON.
  • Pokud používáte System.Text.Json serializaci v režimu generování zdroje. V takovém případě se váš kód nezkompiluje, pokud použijete required modifikátor, protože generování zdroje probíhá v době kompilace.

Následující fragment kódu ukazuje příklad vlastnosti upravené klíčovým slovem required . Tato vlastnost musí být k dispozici v datové části JSON, aby bylo možné provést deserializaci.

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

Alternativně můžete použít 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; }
}

Pomocí vlastnosti je také možné určit, jestli se vlastnost vyžaduje prostřednictvím modelu kontraktu JsonPropertyInfo.IsRequired :

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