You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将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里的titleoverviewposter_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

火山引擎 最新活动