使用RestSharp调用NBA API反序列化失败,无法展示页面数据
解决RestSharp调用NBA API的反序列化问题
1. 正确获取RestSharp响应内容
RestSharp的RestResponse已封装好响应内容,无需手动调用ReadAsStringAsync(),直接通过response.Content就能拿到完整JSON字符串。你之前用response.Content.ReadAsStringAsync().Result属于多余操作,因为Content本身就是字符串类型。
2. 解决JsonSerializationException报错
报错的核心原因是API返回的JSON是外层对象包裹response数组的结构,你直接反序列化为IList<NBAModel>会导致类型不匹配,必须先匹配外层JSON结构。
具体步骤:
- 创建根实体类,对应API返回的外层JSON结构:
public class NBAResponseRoot { // 字段名需和API返回的外层键名完全一致,比如API返回的数组键是"response",就命名为Response public List<NBAModel> Response { get; set; } }
- 选择以下一种反序列化方式处理:
方式一:用RestSharp内置反序列化(推荐)
RestSharp v107+自带JSON反序列化功能,直接调用内置方法:
var client = new RestClient("你的NBA API地址"); var request = new RestRequest(); var response = client.ExecuteGet(request); if (response.IsSuccessful) { var nbaRoot = response.Deserialize<NBAResponseRoot>(); IList<NBAModel> matchData = nbaRoot.Response; // 这里就是5条比赛数据 // 后续执行插入数据表的逻辑 } else { // 处理请求失败场景,比如输出错误信息 Console.WriteLine($"请求失败:{response.ErrorMessage}"); }
方式二:用Newtonsoft.Json手动反序列化
如果习惯用Json.NET,可先获取字符串再手动反序列化:
using Newtonsoft.Json; // 前面的请求代码不变 if (response.IsSuccessful) { string jsonContent = response.Content; var nbaRoot = JsonConvert.DeserializeObject<NBAResponseRoot>(jsonContent); IList<NBAModel> matchData = nbaRoot.Response; // 执行插入数据表逻辑 }
3. 避免程序崩溃的注意事项
- 插入数据表前,先判断
matchData是否为null或空,防止空引用异常 - 确保
NBAModel的字段名、数据类型和API返回的response数组内的对象完全匹配。如果键名不一致,可通过[JsonProperty("api_key_name")]特性映射,比如:
public class NBAModel { [JsonProperty("game_id")] public string GameId { get; set; } // 其他字段同理 }
内容的提问来源于stack exchange,提问作者Adeojo Peter
相关产品推荐
相关产品推荐

