如何将API返回的JSON转换为可遍历的C# List<Movie>集合
解决TMDB API JSON转可遍历Movies列表的问题
我来帮你梳理下代码里的核心问题,一步步搞定这个JSON转Movies列表的事儿~
你的代码里存在的几个关键问题:
- 没有实际发起API请求:你只是初始化了HttpClient,但完全没调用API获取数据,
Json(baseUrl)这个用法是错误的,它不是用来拉取远程JSON的。 - JSON结构不匹配:TMDB的discover/movie接口返回的不是直接的电影数组,而是一个包含
results数组的根对象(还附带分页、总结果数等字段),直接反序列化为List<Movie>会失败。 - 返回类型错误:方法声明返回
AcceptedResult,但你实际要返回View,类型不匹配。
修正后的完整实现:
首先,你需要定义一个根响应模型来匹配TMDB返回的JSON结构:
// 可以放在Models文件夹下 public class MovieApiResponse { [JsonProperty("results")] public List<Movie> Movies { get; set; } // 如果需要分页等其他字段,可以按需添加,比如: // [JsonProperty("page")] // public int Page { get; set; } // [JsonProperty("total_results")] // public int TotalResults { get; set; } }
然后修正你的Controller代码:
using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using pdrake.Models; namespace pdrake.Controllers { public class MovieApiController : Controller { // 记得替换成你真实的TMDB API密钥 private const string baseUrl = "https://api.themoviedb.org/3/discover/movie?api_key=你的密钥"; public async Task<IActionResult> GetMovies() { var movies = new List<Movie>(); using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // 发起GET请求获取API响应 var response = await httpClient.GetAsync(baseUrl); // 检查响应是否成功 if (response.IsSuccessStatusCode) { // 读取响应的JSON字符串 var jsonContent = await response.Content.ReadAsStringAsync(); // 反序列化为根对象,再取出里面的电影列表 var apiResponse = JsonConvert.DeserializeObject<MovieApiResponse>(jsonContent); movies = apiResponse.Movies; } } // 将电影列表传入View,前端即可通过foreach遍历 return View(movies); } } }
额外注意事项:
- 确保你的
Movie模型类的属性和TMDB返回的电影字段对应,比如JSON里的title、overview、poster_path等,用[JsonProperty("字段名")]特性来映射大小写或命名差异。 - 替换代码里的
你的密钥为你在TMDB官网申请的真实API密钥,否则请求会被拒绝。 - 在View中,你可以这样遍历电影列表:
@model List<pdrake.Models.Movie> @foreach (var movie in Model) { <div> <h3>@movie.Title</h3> <p>@movie.Overview</p> </div> }
内容的提问来源于stack exchange,提问作者pdrake1988




