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:
- Adicionando o modificador necessário, que é novo no C# 11.
- Anotando-o com JsonRequiredAttribute, que é novo no .NET 7.
- Modificando a propriedade JsonPropertyInfo.IsRequired do modelo de contrato, que é nova no .NET 7.
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 modificadorrequired
, 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);
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de