Compartilhar via


Leitor de metadados System.Text.Json agora remove o escape de nomes de propriedades de metadados

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.

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.

APIs afetadas