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

如何在C#中从OMDb API的JSON URL正确获取List<Film>?

修正OMDb API数据转换为List的问题

咱们先拆解原代码里的核心问题,再一步步调整到正确状态:

问题分析

  1. JSON结构不匹配:OMDb搜索接口返回的不是直接的电影数组,而是外层包含Search字段的对象(真正的电影列表藏在Search里),原代码直接把整个响应对象塞进List,肯定会出错。
  2. Year字段类型冲突:OMDb返回的Year是字符串格式(比如"2023"或者"2019-2022"这种范围值),直接映射到int?类型会触发反序列化失败。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:58:40