如何在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
相关产品推荐
相关产品推荐

