Конвертировать JSON в C # сложный объект - PullRequest
1 голос
/ 21 октября 2019

У меня есть эта структура в 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; }
}

и самый базовый JSON Iя пытаюсь ввести команду JsonConvert.DeserializeObject<Tree>(tree) is:

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

, но я все равно получаю ноль в дереве;не говоря уже о том, когда JSON становится намного более волосатым (дерево может иметь до 5-го внука).

Спасибо

ОБНОВЛЕНИЕ: после удаления дерева из JSON у меня есть исключение: 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.'

Ответы [ 2 ]

3 голосов
/ 21 октября 2019

Вы должны удалить Tree из вашего JSON, поскольку Tree является типом назначения и его не нужно включать в JSON.

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

РЕДАКТИРОВАТЬ: для десериализации вашего резюме Node элементов, вам понадобится конкретный тип и специальный конвертер. См. Десериализация коллекции абстрактных классов и всех перечисленных дублирующих ссылок

.
1 голос
/ 21 октября 2019

Для этого 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 объект со свойством "Tree""

, который в свою очередь имеет одно свойство" Root "

, которое содержит несколько свойств

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...