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

Xamarin+ABP项目JSON反序列化异常问题求助

解决Newtonsoft.Json反序列化JSON对象为List的异常问题

我来帮你搞定这个反序列化的问题!你遇到的错误核心原因很明确:服务器返回的是一个JSON对象(ABP框架的标准响应包装),但你试图直接把它反序列化为数组类型List<User>,这就导致Newtonsoft.Json无法完成转换,抛出了JsonSerializationException。

先理清楚问题根源

ABP框架的API接口返回的是统一的响应结构,大概长这样:

{
  "result": [
    {"name": "Admin"},
    {"name": "普通用户"}
  ],
  "success": true,
  "error": null,
  "__abp": true
}

你之前的代码直接用JsonConvert.DeserializeObject<List<User>>(json),相当于告诉程序"这个JSON是一个数组",但实际它是一个包含result字段的对象,自然会报错。而且你的User模型定义的Items字段也和返回的result字段不匹配,这也是问题之一。

解决方案步骤

1. 定义匹配ABP响应的模型类

首先要创建一个ABP标准响应的包装类,用来接收整个JSON对象,再提取里面的结果数组:

// API响应的包装类,适配ABP的返回格式
public class AbpApiResponse<T>
{
    [JsonProperty("result")]
    public T Result { get; set; }
    
    [JsonProperty("success")]
    public bool IsSuccess { get; set; }
    
    // 可选:如果需要处理错误信息,可以添加这个字段
    [JsonProperty("error")]
    public AbpApiError Error { get; set; }
}

// 可选:错误信息模型
public class AbpApiError
{
    [JsonProperty("message")]
    public string Message { get; set; }
}

// 你的角色/用户项模型(根据接口GetRoles,建议改成Role更贴合业务)
public class Role
{
    [JsonProperty("name")]
    public string Name { get; set; }
    
    // 接口返回的其他字段,按需添加
}

2. 修改GetUserAsync方法的反序列化逻辑

现在要先把JSON反序列化为包装类,再取出里面的Result(也就是你要的数组):

public async Task<List<Role>> GetRolesAsync(string accessToken) 
{ 
    // 建议复用HttpClient实例,不要每次创建新的,节省资源
    using var client = new HttpClient(); 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 
    
    var json = await client.GetStringAsync("http://serverurl/testrun/api/services/app/user/GetRoles"); 
    
    // 先反序列化为ABP响应对象
    var apiResponse = JsonConvert.DeserializeObject<AbpApiResponse<List<Role>>>(json);
    
    // 检查请求是否成功
    if (apiResponse.IsSuccess)
    {
        return apiResponse.Result;
    }
    else
    {
        // 根据业务需求处理错误,比如抛出异常或者返回空列表
        throw new InvalidOperationException($"获取角色失败:{apiResponse.Error?.Message ?? "未知错误"}");
    }
}

额外的小建议

  • 接口名称是GetRoles,所以方法名改成GetRolesAsync、模型名改成Role,代码可读性会更好;
  • 尽量复用HttpClient实例,频繁创建会导致Socket资源耗尽;
  • 网络请求记得加try-catch,捕获HttpRequestException等异常,提升APP的稳定性;
  • 如果不确定JSON结构,可以用Postman或者浏览器访问接口,先看看返回的具体格式,再调整模型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:43:59