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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:22:03