You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:53:34