Как рекурсивно разобрать json и найти указанный c объект? - PullRequest
2 голосов
/ 04 апреля 2020

Это мой JSON файл Нажми меня !

После C# классов из JSON

public class SiteNode
{
    public string url;
    public string[] param;
    public string serviceid;
    public bool is_enabled;
    public string icon;
    public string nodetype;
    public string api;
    public NodeMeta meta;
    public class NodeMeta
    {
        public bool is_module_legal;
        public string module;
        public string func;
        public MuiText title;
        public MuiText desc;
        public string group;
        public List<string> granted_roles;
    }
    public class MuiText
    {
        public string tw;
        public string gb;
        public string en;
    }
    public List<SiteNode> children;
}

Я уже использую JavaScriptSerializer .Deserialize метод для преобразования в список, но я понятия не имею, чтобы найти serviceid == System-016 этот объект.

Особое внимание к объекту в файле Json можно изменить местоположение , Поэтому я думаю использовать рекурсив для решения этой проблемы.

Пожалуйста, предоставьте мне решение, Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 04 апреля 2020

Вы можете использовать метод, который выполняет итерацию по всем узлам в дереве, например:

public static IEnumerable<T> Flatten<T>(T node, Func<T, IEnumerable<T>> childSelector)
{
    yield return node;

    var children = childSelector(node);

    if (children == null)
    {
        yield break;
    }

    foreach (var child in children)
    {
        foreach (var grandChild in Flatten(child, childSelector))
        {
            yield return grandChild;
        }
    }
}

Затем использовать его, чтобы сгладить структуру дерева перед фильтрацией всего набора или поиском указанного c узел, например:

var rootNode = JavaScriptSerializer.Deserialize<SiteNode>(json);
var filteredNodes = Flatten(rootNode, n => n.children)
    .Where(n => n.serviceid== "System-016");
0 голосов
/ 04 апреля 2020

Если я вас правильно понял, вы бы хотели запросить объект из списка? После того, как вы опустошены от Json.

var yourObject = SiteNode.Where(s => s.serviceId == "System-16").firstOrDefault()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...