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
相关产品推荐
相关产品推荐

