【问题标题】:How to parse JSON string for List of List of anonymous object which contains List of objects?如何解析包含对象列表的匿名对象列表的 JSON 字符串?
【发布时间】:2021-02-11 07:04:47
【问题描述】:

我一直在尝试使用 Newtonsoft 的 Json 库将以下 JSON 字符串反序列化为模型,但没有成功。 json字符串如下:-

[
    [
        {
            "events": [
                {
                    "d": "Dec 2019 Final",
                    "e": "Released 5 Mar 2020"
                }
            ]
        }
    ],
    [
        {
            "events": [
                {
                    "d": "Some String",
                    "e": "Some Other string"
                }
            ]
        }
    ]
]

我尝试通过使用 Visual Studio 内部工具将 json 转换为 C#(特殊粘贴)来创建模型。还尝试使用 QuickTypes.io 创建模型,但到目前为止没有任何效果。

我能做的最好的是将 api 响应解析为List<List<object>>,然后通过迭代其键和值来手动获取值,这是我完全想避免的。 有没有更好的方法来处理这些数据?

【问题讨论】:

    标签: c# asp.net-core xamarin json.net


    【解决方案1】:

    希望我能正确理解您的问题。如果您想坚持使用匿名类型,您可以使用JsonConvert.DeserializeAnonymousType

    var innerAnonymousType = new {d=string.Empty,e=string.Empty};
    var innerAnnonymousTypeList = CreateList(innerAnonymousType);
    var outerAnonymousType = CreateList(new {events = innerAnnonymousTypeList});
    var result = JsonConvert.DeserializeAnonymousType(json, CreateList(outerAnonymousType));
    

    其中 CreateList 被定义为

    public static List<T> CreateList<T>(params T[] elements)
    {
         return new List<T>(elements);
    }
    

    Using JsonConvert.DeserializeAnonymousType

    输出样本

    【讨论】:

    • 感谢您的快速回复。这肯定可以完成这项工作,但问题仍然存在于非静态类型对象上,即难以访问对象值。而不是匿名对象,总是首选具体的实现。
    • @AbhiAbzs 正如我所提到的,问题的标题具有误导性,这就是我对 AnonymousTypes 感兴趣的原因。但很高兴您找到了解决方案
    【解决方案2】:

    您可以使用基本模型并解析您的 json:

        public class BaseClass
        {
            public List<EventModel> Events { get; set; }
        }
    
        public class EventModel
        {
            [JsonProperty(PropertyName = "d")]
            public string Date { get; set; }
    
            [JsonProperty(PropertyName = "e")]
            public string Event { get; set; }
        }
    

    对于反序列化 json 来建模使用这个:

    var model = JsonConvert.DeserializeObject<List<List<BaseClass>>>("your json");
    

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多