UWP项目中获取含多数据类型List的JSON API预订扩展数据
解决UWP中获取所有房间预订数据的问题
你的核心问题在于没有针对每个房间的实际ID动态生成预订API的请求URL,同时预订类的模型和返回的JSON结构不匹配,咱们一步步来搞定:
1. 先修正数据模型的错误
看你提供的预订JSON示例,room字段是单个房间对象,不是数组,但你的Bookings类里把它定义成了List<Class2>,这会直接导致反序列化失败。另外类名和字段的定义也可以更规范一些:
// 单个预订的模型(类名用单数更贴合语义) public class Booking { public string id { get; set; } public int code { get; set; } public DateTime timeFrom { get; set; } public DateTime timeTo { get; set; } public string note { get; set; } // 补上你代码里用到但模型遗漏的字段 public DateTime createdDate { get; set; } // JSON里存在的字段,一并加上 public Room room { get; set; } // 把List<Room>改成单个Room对象 } // 房间模型(重命名Class2为Room,更易读) public class Room { public string name { get; set; } public string id { get; set; } public int seats { get; set; } public DateTime? availableFrom { get; set; } // 用可空类型匹配JSON里的null值 public DateTime? availableTo { get; set; } public Uri ImageUrl => new Uri($"https://api.bookings.com/api/rooms/{id}/image", UriKind.Absolute); public List<Booking> Bookings { get; set; } = new List<Booking>(); // 新增属性存储当前房间的预订 }
2. 正确获取每个房间的预订数据
你之前直接用带占位符的{id}字符串发起请求,这显然无法获取到对应房间的数据。我们需要遍历房间列表,为每个房间生成专属的预订API地址,再请求数据:
方式一:逐个请求(简单直观,适合房间数量少的场景)
// 先获取所有房间列表 HttpClient client = new HttpClient(); string roomResponse = await client.GetStringAsync("https://api.booking.com/api/room"); var rooms = JsonConvert.DeserializeObject<List<Room>>(roomResponse); // 遍历每个房间,获取对应的预订 foreach (var room in rooms) { // 用当前房间的ID动态生成预订API地址 string bookingUrl = $"https://api.booking.com/api/room/{room.id}/bookings"; string bookingResponse = await client.GetStringAsync(bookingUrl); // 反序列化后把预订列表绑定到房间对象上 room.Bookings = JsonConvert.DeserializeObject<List<Booking>>(bookingResponse); }
方式二:并行请求(提高效率,适合房间数量多的场景)
如果房间数量较多,逐个请求会比较慢,可以用Task.WhenAll并行处理所有预订请求:
HttpClient client = new HttpClient(); string roomResponse = await client.GetStringAsync("https://api.booking.com/api/room"); var rooms = JsonConvert.DeserializeObject<List<Room>>(roomResponse); // 为每个房间创建获取预订的异步任务 var bookingTasks = rooms.Select(async room => { string bookingUrl = $"https://api.booking.com/api/room/{room.id}/bookings"; string bookingResponse = await client.GetStringAsync(bookingUrl); room.Bookings = JsonConvert.DeserializeObject<List<Booking>>(bookingResponse); }); // 等待所有预订请求完成 await Task.WhenAll(bookingTasks);
3. 遍历处理房间与预订数据
现在每个Room对象都自带了对应的Bookings列表,你可以直接关联处理:
foreach (var room in rooms) { string id = room.id; string name = room.name; int seats = room.seats; Uri Img = room.ImageUrl; // 遍历当前房间的所有预订 foreach (var booking in room.Bookings) { string note = booking.note; DateTime timeFrom = booking.timeFrom; DateTime timeTo = booking.timeTo; Room bookRoom = booking.room; string bookId = booking.id; int code = booking.code; // 这里可以处理你的业务逻辑,比如判断当前时间是否在预订时段内 if (booking.timeFrom <= DateTime.UtcNow && DateTime.UtcNow <= booking.timeTo) { // templategrid.GreenToRed(); } else { // do stuff } } }
额外提示
- 记得给网络请求添加
try-catch块,捕获HttpRequestException等异常,避免程序崩溃。 - 复用同一个
HttpClient实例,不要每次请求都新建,减少资源消耗。 - 如果API有请求频率限制,并行请求时要注意控制速率,必要时添加延迟。
内容的提问来源于stack exchange,提问作者luddep
相关产品推荐
相关产品推荐

