Partilhar via


O leitor de metadados System.Text.Json agora desscapa os nomes de propriedade de metadados

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.

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.

APIs afetadas