Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 true
y 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.
Acción recomendada
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.