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

时间:2019-07-03 06:49:49

标签: c# json list json.net json-deserialization

这是我第一次反序列化复杂的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

1 个答案:

答案 0 :(得分:1)

您的模型应如下所示:

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;
            }
        }
    }
}