Compartir por


System.Text.Json comprueba si hay conflictos de nombres de propiedad

En determinados contextos, como el polimorfismo y la conservación de referencias, System.Text.Json reserva nombres de propiedad específicos (por ejemplo, $type, $idy $ref) para emitir metadatos. Algunos nombres de propiedad, como , TypeDiscriminatorPropertyName también se pueden configurar con nombres personalizados. Anteriormente, el serializador no realizó la validación de si estos nombres de propiedad entraron en conflicto con contratos definidos por el usuario, lo que podría dar lugar a propiedades duplicadas y generar JSON ambiguos o no pudieron realizar un recorrido de ida y vuelta. A partir de .NET 10, System.Text.Json permite la validación para evitar estas configuraciones y proporciona una advertencia temprana a los usuarios.

Versión introducida

.NET 10

Comportamiento anterior

Anteriormente, el código siguiente generaba un objeto JSON no válido con propiedades duplicadas Type y no se pudo deserializar con :JsonException

using System.Text.Json;
using System.Text.Json.Serialization;

string json = JsonSerializer.Serialize<Animal>(new Dog());
Console.WriteLine(json); // {"Type":"dog","Type":"Dog"}
JsonSerializer.Deserialize<Animal>(json); // JsonException: Deserialized object contains a duplicate 'Type' metadata property.

[JsonPolymorphic(TypeDiscriminatorPropertyName = "Type")]
[JsonDerivedType(typeof(Dog), "dog")]
public abstract class Animal
{
    public abstract string Type { get; }
}

public class Dog : Animal
{
    public override string Type => "Dog";
}

Nuevo comportamiento

A partir de .NET 10, cualquier intento de serializar ese mismo tipo produce un error de validación temprana:

InvalidOperationException: El tipo "Dog" contiene la propiedad "Type" que entra en conflicto con un nombre de propiedad de metadatos existente. Considere cambiar el nombre o ignorarlo con JsonIgnoreAttribute.

Este error de validación se produce cuando se crea por primera vez el serializador o cuando se intenta la serialización por primera vez, lo que proporciona la detección temprana de contratos de serialización no válidos.

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

Este cambio proporciona prevención temprana de contratos de serialización no válidos. Al validar los nombres de propiedad por adelantado, el serializador evita escenarios en los que se emitirían propiedades duplicadas, lo que da lugar a un JSON no válido que no puede realizar un recorrido de ida y vuelta correctamente. Esto ayuda a los desarrolladores a identificar y corregir problemas de configuración durante el desarrollo en lugar de detectarlos en tiempo de ejecución durante la deserialización.

Para obtener más información, consulte:

Evite usar nombres de propiedad que entren en conflicto con las propiedades de metadatos específicas de System.Text.Json (como $type, $idy $ref). Si es absolutamente necesario mantener dicha propiedad en la clase, aplique una anotación JsonIgnoreAttribute en la propiedad en conflicto.

Las APIs afectadas