无法反序列化包含$ ref键的JSON

时间:2014-03-10 11:54:49

标签: c# json json.net

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

  

在JSON参考对象中找到的其他内容。 JSON引用对象应该只有$ ref属性。路径'user.obj',第1行,第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; }
}

1 个答案:

答案 0 :(得分:11)

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.Net,请参阅my answer to a similar question了解一些可能的解决方案。