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

ASP.NET Core调用TMDB API反序列化返回空数组问题求助

问题分析与解决方案

核心问题排查

你遇到的空数组问题,主要来自三个方面:异步调用阻塞、dynamic反序列化的不确定性,以及HttpClient的不规范使用。

分步解决

1. 修复异步调用的阻塞问题

代码里的response.Content.ReadAsStringAsync().Result是同步阻塞调用,会破坏异步流程,改成异步等待:

var stringResponse = await response.Content.ReadAsStringAsync();

2. 替换dynamic为强类型模型(关键解决空数组)

dynamic反序列化时,若属性名大小写不匹配(TMDB返回的是小驼峰格式,C#默认大驼峰),会导致取不到results数据。直接创建对应的数据类,用JsonPropertyName映射字段:

// TMDB响应根对象
public class TmdbResponse
{
    [JsonPropertyName("page")]
    public int Page { get; set; }

    [JsonPropertyName("results")]
    public List<MovieResult> Results { get; set; }

    [JsonPropertyName("total_results")]
    public int TotalResults { get; set; }

    [JsonPropertyName("total_pages")]
    public int TotalPages { get; set; }
}

// 单部电影的结果对象
public class MovieResult
{
    [JsonPropertyName("id")]
    public int Id { get; set; }

    [JsonPropertyName("title")]
    public string Title { get; set; }

    [JsonPropertyName("overview")]
    public string Overview { get; set; }

    [JsonPropertyName("release_date")]
    public string ReleaseDate { get; set; }

    // 按需添加其他字段,比如海报路径、评分等
}

然后修改反序列化代码:

var tmdbResponse = JsonConvert.DeserializeObject<TmdbResponse>(stringResponse);
return Ok(tmdbResponse.Results);

3. 规范HttpClient的使用

每次在using里创建HttpClient会导致socket资源耗尽,ASP.NET Core推荐用依赖注入:

  • 在Program.cs注册HttpClient:
builder.Services.AddHttpClient("TmdbClient", client =>
{
    client.BaseAddress = new Uri("https://api.themoviedb.org/3/");
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "你的BEARER TOKEN");
});
  • 在控制器里注入并使用:
private readonly IHttpClientFactory _httpClientFactory;

public MovieController(IHttpClientFactory httpClientFactory)
{
    _httpClientFactory = httpClientFactory;
}

[HttpGet]
public async Task<IActionResult> GetMoviesList()
{
    var client = _httpClientFactory.CreateClient("TmdbClient");
    var response = await client.GetAsync("movie/now_playing?language=en-US&page=1");
    
    if (response.IsSuccessStatusCode)
    {
        var stringResponse = await response.Content.ReadAsStringAsync();
        var tmdbResponse = JsonConvert.DeserializeObject<TmdbResponse>(stringResponse);
        return Ok(tmdbResponse.Results);
    }
    else
    {
        throw new HttpRequestException(response.ReasonPhrase);
    }
}

4. 验证响应内容

如果问题仍存在,先返回原始的stringResponse,确认TMDB返回的内容是否正常:

return Ok(stringResponse);

检查返回的JSON里是否有results数组,同时确认你的Bearer token是否有效(过期或权限不足会导致TMDB返回错误,可能被误判为空数组)。

内容的提问来源于stack exchange,提问作者Pete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:23:02