Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A System.Text.Json biblioteca foi atualizada para anular nomes de propriedades de metadados. Essa alteração afeta como os documentos JSON são interpretados no contexto de preservação de referência, polimorfismo e validação de propriedades de metadados.
Versão introduzida
.NET 9
Comportamento anterior
Anteriormente, System.Text.Json não escapava dos nomes de propriedade de metadados. Isso levaria à aceitação de nomes de propriedade inválidos, o que poderia ignorar a validação de propriedades de metadados.
Por exemplo, o código a seguir teria êxito na primeira chamada, mas lançaria uma exceção na segunda chamada:
JsonSerializerOptions options = new() { ReferenceHandler = ReferenceHandler.Preserve };
JsonSerializer.Deserialize<MyPoco>("""{"\u0024invalid" : 42 }""", options);
JsonSerializer.Deserialize<MyPoco>("""{"$invalid" : 42 }""", options);
record MyPoco;
O comportamento de fuga também pode causar problemas de polimorfismo ao redondar propriedades de metadados cujos nomes exigem escapar, como visto aqui:
string json = JsonSerializer.Serialize<Base>(new Derived());
Console.WriteLine(json); // {"categor\u00EDa":"derived"}
Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); // False
[JsonPolymorphic(TypeDiscriminatorPropertyName = "categoría")]
[JsonDerivedType(typeof(Derived), "derived")]
public record Base;
public record Derived : Base;
Novo comportamento
System.Text.Json agora remove a codificação dos nomes de propriedades de metadados. Esse novo comportamento significa que a linha Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived);
do exemplo de desserialização polimórfica agora retorna true
, e que nomes de propriedade inválidos falham corretamente ao desserializar com a seguinte exceção:
Unhandled exception. System.Text.Json.JsonException: Properties that start with '$' are not allowed in types that support metadata.
Tipo de mudança disruptiva
Esta alteração é de natureza comportamental .
Motivo da mudança
A alteração melhora a correção e a confiabilidade, garantindo que os nomes de propriedades de metadados não sejam escapados corretamente, impedindo o desvio da validação de propriedades de metadados. Para obter mais detalhes, consulte o problema relatado.
Ação recomendada
Evite usar escape para ignorar a validação de propriedades de metadados. Em vez disso, escolha nomes de propriedade que não entrem em conflito com as propriedades de metadados.