Compartilhar via


System.Text.Json verifica se há conflitos de nome de propriedade

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:

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.

APIs afetadas