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

如何在C#中从Web API获取JSON数组并正确反序列化?

解决C#中从API获取JSON数组的反序列化问题

这个问题其实很常见,你遇到的错误提示已经把原因说得明明白白了:当你请求所有房间数据时,API返回的是一个JSON数组(用方括号[]包裹的多个对象),但你依然用单个Class2类型去反序列化,这就好比你要装一筐苹果,却拿了个只能放单个苹果的盒子,肯定会报错嘛!

核心解决方案:用集合类型反序列化

你只需要把反序列化的目标类型改成集合(比如List<Class2>或者Class2[]),就能完美匹配API返回的数组结构。

修正后的完整代码示例

// 最佳实践:HttpClient应该全局重用,避免频繁创建销毁
private static readonly HttpClient _httpClient = new HttpClient();

public async Task<List<Class2>> GetAllRoomsAsync()
{
    string url = "https://api.booking.com/api/room";
    string response = await _httpClient.GetStringAsync(url);
    // 把反序列化目标改成List<Class2>
    var allRooms = JsonConvert.DeserializeObject<List<Class2>>(response);
    return allRooms;
}

或者如果你更喜欢用数组,也可以这样写:

var allRooms = JsonConvert.DeserializeObject<Class2[]>(response);

为什么这样能解决问题?

Newtonsoft.Json(也就是你用的JsonConvert)需要目标类型和JSON结构严格匹配:

  • 当API返回单个房间时,JSON是一个独立对象(用{}包裹),所以用Class2可以正常反序列化
  • 当API返回所有房间时,JSON是一个数组([]包裹多个对象),所以必须用集合类型(比如List<T>、数组T[],或者实现ICollection<T>的类型)来接收

额外小建议

你的Class2其实是单个房间的模型,建议按照C#命名规范改成更有意义的名字(比如Room),属性名也可以改成 PascalCase(比如Name、Id),然后用[JsonProperty]属性映射API返回的驼峰字段:

public class Room
{
    [JsonProperty("name")]
    public string Name { get; set; }
    
    [JsonProperty("id")]
    public string Id { get; set; }
    
    [JsonProperty("seats")]
    public int Seats { get; set; }
    
    [JsonProperty("availableFrom")]
    public int? AvailableFrom { get; set; }
    
    [JsonProperty("availableTo")]
    public int? AvailableTo { get; set; }
}

这样代码可读性会更高,也符合C#的编码习惯。

验证API返回结构

你提供的API返回示例确实是标准的JSON数组,和错误提示完全对应:

[
  {
    "name": "Rum 1",
    "id": "a31d1fc8-df29-419c-8308-f8bc884b378e",
    "seats": 10,
    "availableFrom": null,
    "availableTo": null
  },
  {
    "name": "Rum 2",
    "id": "7defd34d-222d-4980-b28f-e616e8b9003c",
    "seats": 5,
    "availableFrom": null,
    "availableTo": null
  },
  // ... 更多房间对象
]

内容的提问来源于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 06:47:12