首页 > 解决方案 > 解析 JSON 而不声明模型类

问题描述

我有这样的 JSON:

{
"bookings": {
    "group_id": "abc",
    "name": "Study Rooms",
    "url": "My URL",
    "timeslots": [{
            "room_id": "bcd",
            "room_name": "101",
            "booking_label": "Meeting1",
            "booking_start": "2018-11-30T07:00:00-06:00",
            "booking_end": "2018-11-30T07:30:00-06:00",
            "booking_created": "2018-11-28T11:32:32-06:00"
        }, {
            "room_id": "cde",
            "room_name": "102",
            "booking_label": "Meeting2",
            "booking_start": "2018-11-30T07:30:00-06:00",
            "booking_end": "2018-11-30T08:00:00-06:00",
            "booking_created": "2018-11-28T11:32:32-06:00"
        }, //##AND many more like this##
    ]
}
}

如果我尝试像这样解析它:

var reservations = new { bookings = new { group_id = "", name = "", url="", timeslots = new List<Timeslot>() } };
Newtonsoft.Json.JsonConvert.PopulateObject(jsonResult, reservations);

只有时隙元素被填充

但是,如果我声明一个具有属性 groop_id、名称、url 和时隙集合的模型类,并像这样解析:

var reservations = new { bookings = new BookingsModel() };
Newtonsoft.Json.JsonConvert.PopulateObject(jsonResult, reservations);

它工作正常。

问题是为什么,是否可以在没有模型静态声明的情况下解析 JSON 的所有元素。

标签: c#.netjsonjson.net

解决方案


您无法填充匿名对象的原因是,在 c# 中,匿名类型是不可变的。

相反,您可以使用JsonConvert.DeserializeAnonymousType()它将从现有实例创建匿名类型的新实例:

var reservations = Newtonsoft.Json.JsonConvert.DeserializeAnonymousType(jsonResult, 
        new { bookings = 
            new { group_id = default(string), name = default(string), url=default(string), 
                 timeslots = default(List<Timeslot>) } });      

样品小提琴在这里


推荐阅读