Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Em certos contextos, como polimorfismo e preservação de referências, System.Text.Json reservam nomes específicos de propriedades (por exemplo, $type, $id, e $ref) para emitir metadados. Alguns nomes de propriedades, como o TypeDiscriminatorPropertyName , também podem ser configurados com nomes personalizados. Anteriormente, o serializador não realizava validação para saber se estes nomes de propriedades entravam em conflito com contratos definidos pelo utilizador, o que podia resultar em propriedades duplicadas e produzir JSON ambíguo ou que não conseguia fazer ida e volta. A partir do .NET 10, o System.Text.Json permite validação para prevenir tais configurações e fornece aviso precoce aos utilizadores.
Versão introduzida
.NET 10
Comportamento anterior
Anteriormente, o código seguinte produzia um objeto JSON inválido com propriedades duplicadas Type e falhou em 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 num erro de validação precoce:
InvalidOperationException: O tipo 'Dog' contém a propriedade 'Type' que conflita com o nome de uma propriedade de metadados existente. Considere renomeá-lo ou ignorá-lo com JsonIgnoreAttribute.
Este erro de validação ocorre quando o serializador é criado pela primeira vez ou quando a serialização é tentada pela primeira vez, proporcionando a deteção precoce de contratos de serialização inválidos.
Tipo de mudança disruptiva
Esta alteração é de natureza comportamental .
Motivo da mudança
Esta alteração proporciona uma prevenção precoce de contratos de serialização inválidos. Ao validar os nomes das propriedades antecipadamente, o serializador previne cenários em que propriedades duplicadas sejam emitidas, resultando em JSON inválido que não consegue fazer o round-trip corretamente. Isto ajuda os programadores a identificar e corrigir problemas de configuração durante o desenvolvimento, em vez de os descobrir em tempo de execução durante a desserialização.
Para obter mais informações, consulte:
- [STJ] Não permitir nomes de propriedades que entrem em conflito com nomes de propriedades de metadados (dotnet/runtime#106390)
- Impedir tipos com nomes de propriedades que conflitam com meta-dados (dotnet/runtime#106460)
Ação recomendada
Evite usar nomes de propriedades que entrem em conflito com propriedades de metadados específicas do System.Text.Json (como $type, $id, e $ref). Se for absolutamente necessário manter essa propriedade na classe, aplique uma anotação JsonIgnoreAttribute na propriedade em conflito.