Compartilhar via


Propriedades obrigatórias

A partir do .NET 7, você pode marcar determinadas propriedades para significar que elas devem estar presentes no conteúdo JSON para que a desserialização seja bem-sucedida. Se uma ou mais dessas propriedades necessárias não estiverem presentes, os métodos JsonSerializer.Deserialize lançarão uma JsonException.

Há três maneiras de marcar uma propriedade ou campo conforme necessário para desserialização JSON:

Da perspectiva do serializador, essas duas demarcações são equivalentes e mapeiam para a mesma parte dos metadados, que é JsonPropertyInfo.IsRequired. Na maioria dos casos, você simplesmente usaria a palavra-chave integrada de C#. No entanto, você deve usar JsonRequiredAttribute nos seguintes casos:

  • Se estiver usando uma linguagem de programação diferente de C# ou uma versão de nível inferior de C#.
  • Se quiser apenas aplicar o requisito à desserialização JSON.
  • Se estiver usando a serialização System.Text.Json no modo de geração de origem. Nesse caso, seu código não será compilado se você usar o modificador required, pois a geração de origem ocorrerá em tempo de compilação.

O snippet de código a seguir mostra um exemplo de uma propriedade modificada com a palavra-chave required. Essa propriedade deve estar presente no conteúdo JSON para que a desserialização seja bem-sucedida.

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

Como alternativa, você pode usar 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; }
}

Também é possível controlar se uma propriedade é necessária por meio do modelo de contrato usando a propriedade 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);