Compartir a través de


System.Text.Json ahora desescapa los nombres de las propiedades de metadatos

La biblioteca System.Text.Json se ha actualizado para anular el escape de los nombres de propiedades de metadatos. Este cambio afecta a cómo se interpretan los documentos JSON en el contexto de conservación de referencia, polimorfismo y validación de propiedades de metadatos.

Versión introducida

.NET 9

Comportamiento anterior

Anteriormente, System.Text.Json no anulaba el escape de los nombres de propiedad de metadatos. Esto provocaría que se acepten nombres de propiedad no válidos, lo que podría omitir la validación de propiedades de metadatos.

Por ejemplo, el código siguiente se realizará correctamente en la primera llamada, pero producirá una excepción en la segunda llamada:

JsonSerializerOptions options = new() { ReferenceHandler = ReferenceHandler.Preserve };
JsonSerializer.Deserialize<MyPoco>("""{"\u0024invalid" : 42 }""", options);
JsonSerializer.Deserialize<MyPoco>("""{"$invalid" : 42 }""", options);

record MyPoco;

El comportamiento de anulación de escape también podría provocar problemas de polimorfismo al redirigir las propiedades de metadatos cuyos nombres requieren escape, como se muestra aquí:

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;

Nuevo comportamiento

System.Text.Json ahora anula el escape de los nombres de propiedades de metadatos. Este nuevo comportamiento significa que la línea Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); del ejemplo de deserialización polimórfica ahora devuelve truey que los nombres de propiedad no válidos no se pueden deserializar correctamente con la siguiente excepción:

Unhandled exception. System.Text.Json.JsonException: Properties that start with '$' are not allowed in types that support metadata.

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

El cambio mejora la exactitud y la fiabilidad al asegurarse de que se anula el escape de los nombres de propiedad de los metadatos correctamente, evitando la omisión de la validación de propiedades de metadatos. Para obtener más información, consulte el problema notificado.

Evite usar el escape para omitir la validación de propiedades de metadatos. En su lugar, elija nombres de propiedad que no entren en conflicto con las propiedades de metadatos.

Las APIs afectadas