json.net - 自引用属性的反序列化不起作用

标签 json.net

我的这个对象有一个 Parent 属性,它引用了另一个相同类型的对象:

[JsonObject(IsReference = true)]
class Group
{
    public string Name { get; set; }

    public Group(string name)
    {
        Name = name;
        Children = new List<Group>();
    }

    public IList<Group> Children { get; set; }

    public Group Parent { get; set; }

    public void AddChild(Group child)
    {
        child.Parent = this;
        Children.Add(child);
    }
}

序列化工作正常并导致 json 看起来像这样:

{
  "$id": "1",
  "Name": "Parent",
  "Children": [
    {
      "$id": "2",
      "Name": "Child",
      "Children": [],
      "Parent": {
        "$ref": "1"
      }
    }
  ],
  "Parent": null
}

但是反序列化不起作用。 Parent 属性返回 null。

测试看起来像这样:

[Test]
public void Test()
{
    var child = new Group("Child");
    var parent = new Group("Parent");
    parent.AddChild(child);

    var json = JsonConvert.SerializeObject(parent, Formatting.Indented);
    Debug.WriteLine(json);

    var deserializedParent = (Group) JsonConvert.DeserializeObject(json, typeof(Group));
    Assert.IsNotNull(deserializedParent.Children.First().Parent);
}

我做错了什么?任何帮助表示赞赏!

最佳答案

使用引用不适用于只有构造函数和参数的对象。

Json.NET 必须在创建父值之前反序列化所有子值,它需要将这些值传递给构造函数,因此没有有效的父引用可分配给子值。

关于json.net - 自引用属性的反序列化不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42638350/

相关文章:

C# Json.NET WCF Rest 日期时间格式

c# - 动态变量不能在 C# 中使用 Json.Net

c# - 我可以确定字符串是否可以被 newtonsoft 反序列化吗?

c# - 为什么相互比较 2 个 .NET 框架类会导致 stackoverflow 异常?

c# - 如何防止 Json.NET 对缺少的构造函数参数使用默认值,同时仍然对属性使用默认值?

c# - 读取两个 JSON 文件并将第一个文件中不存在的第二个文件中存在的所有项目提取到一个新对象

c# - 在 JSON.NET 中使用 LINQ 从字典创建 JProperty

json.net - 使用 TypeNameHandling.All 处理命名空间更改

c# - 字符 Å Ä Ö 没有显示在我的 DDL 中,我如何告诉 restclient 使用特定的字符集?

c# - 当字符串比较断言看起来应该通过时却失败