【问题标题】:How to properly handle a deserialize JSON object [closed]如何正确处理反序列化 JSON 对象 [关闭]
【发布时间】:2019-11-13 19:24:07
【问题描述】:

这是我第一次反序列化复杂的 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&lt;RootObject&gt;(response.Body);

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

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

这是我的 Json 数据

https://anotepad.com/notes/h96yqk

【问题讨论】:

  • 您是如何在您的课程中获得 JSON 结构的?它根本不代表您的 JSON 数据
  • 嗨,Camilo,我使用了 Json2Csharp
  • 快速查看您定义的类,Child 不应该存在,Datum 应该有一个List&lt;Datum&gt; 类型的列表
  • 您认为您的结果到底有什么问题? “适当地”是什么意思?如果您反序列化到该结构,结果看起来几乎是您所期望的(顺便说一句,与上面的 cmets 相反,我认为从表面上看并不是特别成问题)。 data 是一个数组,所以 List&lt;Datum&gt; 看起来是正确的,那么您在其中就有 children 作为另一个数组。所以如果你想得到孩子,你必须遍历或搜索这些列表,就像任何其他 C# 列表一样。那么你真的在问如何在 C# 中使用列表吗?
  • @Bleep-Bloop 为什么Child 类不存在?显然,它代表 JSON 中(外部)children 数组中的项目实例

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


【解决方案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;
            }
        }
    }
}

【讨论】:

  • 我现在试试,谢谢
猜你喜欢
  • 1970-01-01
  • 2018-10-03
  • 2023-03-30
  • 1970-01-01
  • 2016-09-05
  • 2021-06-08
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
相关资源
最近更新 更多