如何正确处理反序列化 JSON 对象

How to properly handle a deserialize JSON object

这是我第一次反序列化复杂的 JSON 字符串。这是我的模型:

public class Child
    {
        public List<object> children { get; set; }
        public bool var { get; set; }
        public string name { get; set; }
        public bool leaf { get; set; }
        public int category_id { get; set; }
    }
    public class Datum
    {
        public List<Child> children { get; set; }
        public bool var { get; set; }
        public string name { get; set; }
        public bool leaf { get; set; }
        public int category_id { get; set; }
    }

    public class RootObject
    {
        public List<Datum> data { get; set; }
    }

然后我使用以下方法反序列化字符串:

RootObject rootobj = JsonConvert.DeserializeObject<RootObject>(response.Body);

这是我的结果: https://i.stack.imgur.com/4jiMA.png

我该如何正确处理这个结果?我正在使用 ASP.NET 以及如何在父数据中获取子数据以及如何使用它们?我在互联网上搜索了好几天,但所有的帮助都让我反序列化了 JSON 响应,而不是如何使用它们。谢谢你的回答。

这是我的 Json 数据

https://anotepad.com/notes/h96yqk

您的模型应该是什么样子:

public class Datum
{
    public List<Datum> children { get; set; }
    public bool var { get; set; }
    public string name { get; set; }
    public bool leaf { get; set; }
    public int category_id { get; set; }
}

public class RootObject
{
    public List<Datum> data { get; set; }
}

创建 json 结果的平面结构。这允许您遍历所有对象,就好像它是单个数组一样(我假设您想要处理数据)。

var flat = root.data.SelectMany(x => x.SelectChilds(y => y.children));

帮助创建平面结构的扩展方法:

public static class Extensions
{
    /// <summary>
    /// Recursive method to return a flat structure of child elements
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source"></param>
    /// <param name="func">Function to get child elements</param>
    /// <returns></returns>
    public static IEnumerable<T> SelectChilds<T>(this T source, Func<T, IEnumerable<T>> func)
    {
        yield return source;
        foreach (T element in func(source) ?? Enumerable.Empty<T>())
        {
            var subs = element.SelectChilds(func);
            foreach (T sub in subs)
            {
                yield return sub;
            }
        }
    }
}