不能反序列化包含$ref键的JSON

本文关键字:键的 JSON ref 反序列化 包含 不能 | 更新日期: 2023-09-27 17:49:21

我有以下代码试图反序列化JSON字符串,库给了我这个错误:

在JSON引用对象中找到的附加内容。JSON引用对象应该只有一个$ref属性。路径的用户。Obj ',第一行,位置34.

你知道怎么回事吗?(我知道它在抱怨第二个$ref,但我不知道为什么。)解决方法是什么?

void Main()
{
    var s = "{'"user'": {'"$ref'": '"123456'", '"obj'": {'"$ref'": '"123456'"}}}";
    JsonConvert.DeserializeObject<Root>(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; }
}

不能反序列化包含$ref键的JSON

Json。Net使用$ref$id作为元数据来保存JSON中的对象引用。因此,当它看到$ref时,它假设属性不是实际JSON属性集的一部分,而是一个内部标识符,指的是JSON中其他地方的匹配$id。因为你对$ref的使用不同于Json。Net期望看到,它正在抛出一个错误。

在Json。Net 6.0.4及更高版本中,现在有了一个设置,您可以通过该设置指示反序列化器将这些元数据属性视为普通属性,而不是使用它们。您所需要做的就是将MetadataPropertyHandling设置为Ignore,然后像往常一样反序列化。

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

在版本6.0.4之前,需要一个解决方案来解决这个问题。如果无法升级到最新版本的Json。请参阅我对类似问题的回答,以获得一些可能的解决方案。