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

ASP.NET MVC无法解析HTTP GET响应JSON为Movie列表的解决方案

问题根因

themoviedb 接口返回的JSON根节点是包含分页元数据的包装结构,page、total_pages、total_results等分页字段和存放电影列表的results数组同属根层级。直接将完整响应反序列化为IList<Movie>或Movie[]类型时,序列化器会尝试将根节点的非数组字段匹配到Movie类型的属性,必然触发属性不匹配的解析报错。

实现方案

方案1:定义响应包装类(推荐,可复用性强)

  1. 新增对应TMDB接口根结构的包装类,映射根节点所有字段:
public class TmdbMovieApiResponse
{
    public int Page { get; set; }
    // 映射存放电影列表的results字段
    public Movie[] Results { get; set; }
    public int TotalPages { get; set; }
    public int TotalResults { get; set; }
}
  1. 修改Controller中的反序列化逻辑,先反序列化为包装类,再提取Results属性传递给绑定Movie[]模型的视图:
  • 若使用Newtonsoft.Json(Json.NET,ASP.NET MVC 5及以下默认序列化库):
public async Task<ActionResult> MovieList()
{
    // 已完成的HttpClient配置、请求地址拼接、请求头设置逻辑保持不变
    var httpResponse = await httpClient.GetAsync("拼接完成的TMDB电影列表接口地址");
    httpResponse.EnsureSuccessStatusCode();
    var jsonContent = await httpResponse.Content.ReadAsStringAsync();

    // 先反序列化到包装对象
    var apiResult = JsonConvert.DeserializeObject<TmdbMovieApiResponse>(jsonContent);
    // 提取results数组传给视图
    return View(apiResult.Results);
}
  • 若使用System.Text.Json(.NET Core/.NET 5+默认序列化库):
    反序列化时开启大小写不敏感匹配,适配TMDB返回的小驼峰字段命名:
var apiResult = JsonSerializer.Deserialize<TmdbMovieApiResponse>(jsonContent, new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true
});

方案2:直接提取results节点(无需额外定义包装类)

如果不想新增响应包装类,可以直接解析JSON节点,提取results段后再反序列化为Movie列表:

  • Newtonsoft.Json 写法:
var jObj = JObject.Parse(jsonContent);
var movieList = jObj["results"].ToObject<Movie[]>();
return View(movieList);
  • System.Text.Json 写法:
using var jsonDoc = JsonDocument.Parse(jsonContent);
var resultsElement = jsonDoc.RootElement.GetProperty("results");
var movieList = resultsElement.Deserialize<Movie[]>(new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true
});
return View(movieList);

注意:如果Movie实体类的属性名和TMDB返回的电影字段名(小驼峰、下划线命名,如release_date、poster_path)不匹配,需要给对应属性加序列化映射特性:Newtonsoft.Json用[JsonProperty("接口字段名")],System.Text.Json用[JsonPropertyName("接口字段名")],避免单个字段解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:57:11