【问题标题】:Convert JSON to C# complex object将 JSON 转换为 C# 复杂对象
【发布时间】:2019-10-21 11:26:45
【问题描述】:

我在 C# 中有这个结构,我想创建可以成功转换为它的 JSON,以便我可以很容易地在 JS 逻辑中找到我的错误。

public class Tree
{
        public Root Root { get; set; }
        public Tree()
        {}
}

public class Root : Node
{
        public Root(int _id, int _fk, string _name, string _code, List<Node> _children, List<Item> _leaves)
            : base(_id, _fk, _name, _code, _children, _leaves)
        {
        }

        public Root()
        { }
}

public abstract class Node
{
        public int? ID { get; set; }
        public int? FK { get; set; }
        public string Name { get; set; }
        public string Code { get; set; }
        public List<Node> children { get; set; }
        public List<Item> leaves { get; set; }

        public Node(int? _id, int? _fk, string _name, string _code, List<Node> _children, List<Item> _leaves)
        {
            ID = _id;
            FK = _fk;
            Name = _name;
            Code = _code;
            children = _children;
            leaves = _leaves;
        }
        public Node ()
        {}
}

public class Item
{
        public string Code { get; set; }
        public string Desc { get; set; }
        public string Uom { get; set; }
        public float? Measurements { get; set; }
        public int? FK { get; set; }
        public int? Tier { get; set; }
        public bool IsADPresent { get; set; }
}

我试图在命令JsonConvert.DeserializeObject&lt;Tree&gt;(tree) 中输入的最基本的 JSON 是:

{
    "Tree": {
        "Root": {
            "children": [],
            "leaves": [],
            "FK": 1,
            "ID": 1,
            "Name": " LOGISTICS",
            "Code": "PT01"
        }
    }
}

但我仍然在 Tree 中得到 null;更不用说当 JSON 变得更加多毛时(这棵树最多可以有 5 个孙子)。

谢谢

更新:从 JSON 中删除 Tree 时出现异常: Newtonsoft.Json.JsonSerializationException: 'Could not create an instance of type StatusUpdater.Models.NPoco.Node. Type is an interface or abstract class and cannot be instantiated. Path 'Root.children[0].children', line 1, position 33.'

【问题讨论】:

    标签: c# json object tree json-deserialization


    【解决方案1】:

    您应该从 JSON 中删除 Tree,因为 Tree 是目标类型,不需要包含在 JSON 中。

    {
        "Root": {
            "children": [],
            "leaves": [],
            "FK": 1,
            "ID": 1,
            "Name": " LOGISTICS",
            "Code": "PT01"
        }
    }
    

    编辑:为了反序列化您的抽象 Node 元素,您将需要一个具体类型和一个自定义转换器。请参阅Deserializing a collection of abstract classes 和列出的所有重复链接

    【讨论】:

    • 您对它应该如何的保证,帮助我意识到我实际上是在处理 JSON 中的 2 个错误,而不是 1 个。我以前有过这样的情况,但是由于不匹配而出现异常 JsonSerializationException进一步向下映射!我以为是因为缺少Tree,添加了它并没有发生异常。实际上,我引起了另一个掩盖了前一个问题的问题。我所要做的就是删除 Root 和 children[] 之间的额外子节点(在我放在这里的示例中我注意到了)。
    • 好的,看来这只是部分答案。删除 Tree 让我找回了实际上有意义的异常。由于 Node 是抽象的,它当然无法实例化它。请问有什么解决方法吗?
    • 您可以删除Node 类上的关键字abstract 吗?还是强制的?
    • 嗯,你需要一个具体类型和一个自定义转换器。请参阅stackoverflow.com/questions/52808857/… 和列出的所有重复链接
    • 是的,我自己已经在学习一个例子。非常感谢An0d。请将此作为答案,以便我将其标记为已接受。
    【解决方案2】:

    对于这个 json,您需要创建一个包装类。

    public class X { public Tree {get; set;} } 
    
    (...)
    
    var tree = JsonConvert.DeserializeObject<X>(tree)?.Tree;
    
    

    为什么?

    让我们检查一下 json。

    {
        "Tree": {
            "Root": {
                "children": [],
                "leaves": [],
                "FK": 1,
                "ID": 1,
                "Name": " LOGISTICS",
                "Code": "PT01"
            }
        }
    }
    

    这个json包含

            1 个具有“树”属性的对象

                    这又具有一个属性“根”

                           包含多个属性

    【讨论】:

    • 你是对的,但我的问题是如何编辑 JSON 而不是 C# 模型。事实上,我在 JSON 方面做了同样的事情,因为我认为我也必须通过树,因为我收到了错误的异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多