No se puede deserializar JSON que contenga $ ref claves

Tengo el siguiente código intentando deserializar una cadena JSON y la biblioteca me da este error:

Contenido adicional encontrado en el objeto de referencia JSON. Un objeto de referencia JSON solo debe tener una propiedad $ ref. Ruta ‘usuario.obj’, línea 1, posición 34.

¿Alguna idea de lo que está mal? (Entiendo que se queja sobre el segundo $ ref, pero no sé por qué). ¿Cuál es la solución?

void Main() { var s = "{\"user\": {\"$ref\": \"123456\", \"obj\": {\"$ref\": \"123456\"}}}"; JsonConvert.DeserializeObject(s).Dump(); } // Define other methods and classes here public class Root { [JsonProperty("user")] public User User { get; set; } } public class User { [JsonPropertyAttribute("$ref")] public string Ref { get; set; } [JsonPropertyAttribute("obj")] public Obj Obj { get; set; } } public class Obj { [JsonPropertyAttribute("$ref")] public string Ref { get; set; } } 

Json.Net usa $ref junto con $id como metadatos para preservar las referencias de objetos en JSON. Entonces, cuando ve $ref , asume que la propiedad no es parte del conjunto real de propiedades JSON, sino un identificador interno que se refiere a un $id coincidente en otro lugar en el JSON. Dado que su uso de $ref es diferente de lo que Json.Net espera ver, está generando un error.

ACTUALIZAR

En la versión 6.0.4 y posterior de Json.Net , ahora hay una configuración mediante la cual puede indicar al deserializador que trate estas propiedades de metadatos como propiedades normales en lugar de consumirlas. Todo lo que necesita hacer es establecer la configuración de MetadataPropertyHandling en Ignore y luego deserializar como de costumbre.

 var settings = new JsonSerializerSettings(); settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore; var obj = JsonConvert.DeserializeObject(json, settings); 

Antes de la versión 6.0.4, se necesitaba una solución para resolver este problema. Si no puede actualizar a la última versión de Json.Net, vea mi respuesta a una pregunta similar para algunas posibles soluciones.