如何将Web API响应转换为Model类格式?解决反序列化报错
问题解决:JSON数组反序列化为对象的错误
核心问题分析
你遇到的错误根源是:JSON响应里的picture_list是数组([]包裹),但你的ProductViewModel中定义的picture_list是单个picture_list对象,Json.NET无法直接将数组转换为单个对象,因此抛出序列化错误。另外JSON响应中第一个PictureId为空值,直接反序列化为int类型会失败,也需要处理。
步骤1:修正模型类
将ProductViewModel中的picture_list改为集合类型,同时修正类命名规范(符合C#编码习惯),并把PictureId设为可空类型以兼容空值:
public class ProductViewModel { public int album_id { get; set; } public string album_name { get; set; } public bool is_face_detection { get; set; } public string message { get; set; } public bool status { get; set; } public bool has_next_page { get; set; } public int total_images { get; set; } public int selected_images { get; set; } public string large_thumb_width { get; set; } // 把单个对象改为列表,匹配JSON数组结构 public List<PictureItem> picture_list { get; set; } } // 修正类名,符合C#大驼峰命名规范 public class PictureItem { // 设为可空int,处理JSON中的空PictureId值 public int? PictureId { get; set; } public Uri PictureUrl { get; set; } public bool IsSelected { get; set; } }
步骤2:修正控制器代码
你的控制器存在异步操作阻塞、重复反序列化、错误转换单个响应为列表的问题,修改后代码如下:
public async Task<IActionResult> Create(PictureModel picture) { string apiUrl = "https://localhost:6789/api/v1"; List<ProductViewModel> products = new List<ProductViewModel>(); // 使用using确保HttpClient资源正确释放 using (HttpClient client = new HttpClient()) { client.BaseAddress = new Uri(apiUrl); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "eyyourtokenhereo"); // 用await替代.Result,避免异步操作阻塞 HttpResponseMessage response = await client.GetAsync($"/pictureDetails/?studioId={picture.studioId}&albumid={picture.albumid}&pageIndex={picture.pageIndex}&isTablet={picture.isTablet}&faceid={picture.faceid}"); if (response.IsSuccessStatusCode) { var apiResponse = await response.Content.ReadAsStringAsync(); // 反序列化为单个ProductViewModel对象(API响应是单个对象而非数组) ProductViewModel product = JsonConvert.DeserializeObject<ProductViewModel>(apiResponse); products.Add(product); return View(products); } } return View(products); }
额外注意事项
- 空值兼容:如果API返回的
PictureId可能为空,必须保持模型中PictureId的可空类型,否则会再次触发序列化错误。 - 异步规范:所有异步操作统一使用
await,避免.Result导致的线程阻塞问题。 - 字符串拼接:使用C#字符串插值替代
string.Format,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Madhuri Pande
相关产品推荐
相关产品推荐

