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.
A biblioteca System.Text.Json foi atualizada para remover o escape dos nomes de propriedades de metadados. Essa alteração afeta a forma como os documentos JSON são interpretados no contexto de preservação de referência, polimorfismo e validação da propriedade de metadados.
Versão introduzida
.NET 9
Comportamento anterior
Anteriormente, System.Text.Json não removia as sequências de escape nos nomes de propriedades de metadados. Isso levaria a nomes de propriedade inválidos sendo aceitos, o que poderia ignorar a validação da propriedade 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 desfazer o escapamento também pode causar problemas de polimorfismo ao realizar o ciclo completo de propriedades de metadados cujos nomes exigem escapamento, 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 reverte a escape de 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 truee que os nomes de propriedades 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 é uma alteração comportamental.
Motivo da alteração
A alteração aprimora a correção e a confiabilidade, garantindo que os nomes de propriedades de metadados sejam adequadamente sem escape, evitando o desvio da validação de propriedades de metadados. Para obter mais detalhes, consulte o problema relatado.
Ação recomendada
Evite utilizar técnicas de escape para ignorar a validação de propriedades de metadados. Em vez disso, escolha nomes de propriedades que não entram em conflito com as propriedades de metadados.