c# - 反序列化json树结构并设置父级

标签 c# json serialization json.net deserialization

这似乎是一个非常基本的问题,但我正在努力寻找一个优雅的解决方案。我有一个用于构建树结构的 Node 类。然后使用 JsonConvert.SerializeObject(..) 将其序列化为 JSON。为了在序列化时防止循环引用,我在 Parent 属性上放置了一个 JsonIgnore 属性。

这显然意味着在生成的 JSON 输出中,父节点没有被序列化为每个节点的一部分。

当我反序列化相同的 JSON 字符串时,我希望为 Node 对象分配正确的 Parent,以便我可以轻松地向上遍历树。实现这一目标的最干净、最简单的方法是什么?

[JsonObject]
public class Node : IEnumerable<Node>
{
    public Guid Id { get; set; }
    public string Name { get; set; }

    [JsonIgnore]
    public Node Parent { get; private set; }

    [JsonProperty("Children")]
    private readonly Dictionary<Guid, Node> _children = new Dictionary<Guid, Node>();

    public Node()
    {
        Id = Guid.NewGuid();
    }

    public void Add(Node departmentNode)
    {
        if (node.Parent != null)
        {
            node.Parent._children.Remove(node.Id);
        }

        node.Parent = this;
        _children.Add(node.Id, node);
    }

    public IEnumerator<Node> GetEnumerator()
    {
        return _children.Values.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

最佳答案

您可以完全摆脱 Parent 并在需要查找时使用类似 FindParent(node.Id) 的东西。

如果这不可行(虽然应该可行)并且您需要有父引用,我的建议是遍历树并在反序列化后设置父引用。

关于c# - 反序列化json树结构并设置父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35428232/

相关文章:

c# - Application.ThreadException 与 AppDomain.UnhandledException

json - 是否可以在 django-rest-framework 序列化程序中动态更改字段名称?

c# - 是否有使用 basicHttpBinding 扩展 WCF 服务以允许 REST 服务与 JSON 通信的好方法?

python - Django:没有这样的表 snippets_snippet

c# - JsonConvert.DeserializeObject() 抛出 StackOverflow 异常

C# 错误 - 找不到命名空间 ManagementClass、ManagementObject 和 ManagementObjectCollection

c# - HttpContext 和 HttpRequest 之间的区别?

c# - 在 WPF DataGrid 上显示行号的简单方法

python - 在 Python/django 中读取 json 时可能出现多少异常?

android - 在 Android 上持久化数据的建议?