如何在C#中从OMDb API的JSON URL正确获取List<Film>?
修正OMDb API数据转换为List的问题
咱们先拆解原代码里的核心问题,再一步步调整到正确状态:
问题分析
- JSON结构不匹配:OMDb搜索接口返回的不是直接的电影数组,而是外层包含
Search字段的对象(真正的电影列表藏在Search里),原代码直接把整个响应对象塞进List,肯定会出错。 - Year字段类型冲突:OMDb返回的
Year是字符串格式(比如"2023"或者"2019-2022"这种范围值),直接映射到int?类型会触发反序列化失败。 - WebClient已过时:
WebClient是.NET旧版工具类,现在更推荐用高效、符合现代实践的HttpClient。
修正步骤
1. 调整模型结构
先定义匹配OMDb响应的外层模型,同时处理Year字段的类型兼容问题:
// 匹配OMDb搜索接口的外层响应结构 public class OmdbSearchResponse { public List<Film> Search { get; set; } public string TotalResults { get; set; } public string Response { get; set; } // 可选:添加Error字段,用于捕获接口返回的错误信息 public string Error { get; set; } } public class Film { public string Title { get; set; } // 先接收OMDb返回的字符串格式Year [JsonProperty("Year")] public string YearString { get; set; } // 可选:提供计算属性,尝试将YearString转为可空整数(处理范围值时取起始年份) public int? Year { get { if (!string.IsNullOrEmpty(YearString) && int.TryParse(YearString.Split('-')[0], out int year)) return year; return null; } } }
2. 重构API调用代码
替换过时的WebClient为HttpClient,并正确反序列化响应数据:
private const string ApiKey = "18693fd6"; // 推荐全局复用HttpClient,避免频繁创建释放连接 private static readonly HttpClient _httpClient = new HttpClient(); public async Task<List<Film>> ListarFilmesAsync(string filtro) { // 对搜索关键词做URL编码,避免特殊字符导致请求失败 var encodedFiltro = Uri.EscapeDataString(filtro); var requestUrl = $"http://www.omdbapi.com/?s={encodedFiltro}&apikey={ApiKey}"; var jsonResponse = await _httpClient.GetStringAsync(requestUrl); var searchResult = JsonConvert.DeserializeObject<OmdbSearchResponse>(jsonResponse); // 根据接口返回的Response状态判断是否返回有效列表 return searchResult?.Response == "True" ? searchResult.Search : new List<Film>(); }
额外提示
- 异步方法:改成异步方法
ListarFilmesAsync符合.NET异步编程规范,避免阻塞主线程。 - 错误处理:如果需要捕获接口错误,可以检查
searchResult?.Error字段,比如返回"Movie not found!"时做日志或用户提示。 - URL编码:必须对搜索关键词做编码,否则关键词含空格、特殊字符时会导致请求失效。
内容的提问来源于stack exchange,提问作者Pat
相关产品推荐
相关产品推荐

