不能反序列化包含$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; }
}
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。请参阅我对类似问题的回答,以获得一些可能的解决方案。