Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Em determinados contextos, como polimorfismo e preservação de referência, System.Text.Json reserva nomes de propriedade específicos (por exemplo, $typee $id$ref) para emitir metadados. Alguns nomes de propriedade como o TypeDiscriminatorPropertyName também podem ser configurados com nomes personalizados. Anteriormente, o serializador não realizava a validação sobre se esses nomes de propriedade estavam em conflito com contratos definidos pelo usuário, o que poderia resultar em propriedades duplicadas e produzir JSON que fosse ambíguo ou não fosse de ida e volta. A partir do .NET 10, System.Text.Json permite a validação para impedir essas configurações e fornece aviso antecipado aos usuários.
Versão introduzida
.NET 10
Comportamento anterior
Anteriormente, o código a seguir produzia um objeto JSON inválido com propriedades Type duplicadas e falhava ao desserializar com um JsonException.
using System.Text.Json;
using System.Text.Json.Serialization;
string json = JsonSerializer.Serialize<Animal>(new Dog());
Console.WriteLine(json); // {"Type":"dog","Type":"Dog"}
JsonSerializer.Deserialize<Animal>(json); // JsonException: Deserialized object contains a duplicate 'Type' metadata property.
[JsonPolymorphic(TypeDiscriminatorPropertyName = "Type")]
[JsonDerivedType(typeof(Dog), "dog")]
public abstract class Animal
{
public abstract string Type { get; }
}
public class Dog : Animal
{
public override string Type => "Dog";
}
Novo comportamento
A partir do .NET 10, qualquer tentativa de serializar esse mesmo tipo resulta em um erro de validação antecipada:
InvalidOperationException: o Tipo 'Dog' contém a propriedade 'Type' que entra em conflito com um nome de propriedade de metadados existente. Considere renomeá-lo ou, alternativamente, ignorá-lo usando o JsonIgnoreAttribute.
Esse erro de validação ocorre quando o serializador é criado pela primeira vez ou quando a serialização é tentada pela primeira vez, fornecendo a detecção antecipada de contratos de serialização inválidos.
Tipo de mudança disruptiva
Essa alteração é uma mudança comportamental.
Motivo da alteração
Essa alteração fornece prevenção antecipada de contratos de serialização inválidos. Ao validar os nomes de propriedades antecipadamente, o serializador impede cenários em que propriedades duplicadas seriam emitidas, resultando em JSON inválido que não pode ser convertido corretamente de ida e volta. Isso ajuda os desenvolvedores a identificar e corrigir problemas de configuração durante o desenvolvimento, em vez de descobri-los em runtime durante a desserialização.
Para obter mais informações, consulte:
- [STJ] Não permitir nomes de propriedade que entram em conflito com nomes de propriedade de metadados (dotnet/runtime#106390)
- Não permitir tipos com nomes de propriedade conflitantes com metadados (dotnet/runtime#106460)
Ação recomendada
Evite usar nomes de propriedade que entram em conflito com propriedades de metadados específicas de System.Text.Json (como $type, $ide $ref). Se for absolutamente necessário manter essa propriedade na classe, aplique uma JsonIgnoreAttribute anotação na propriedade conflitante.