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

