API返回JSON无法通过DeserializeObject反序列化至APIResponse类问题求助
问题排查与解决方案
核心原因
反序列化后APIResponse所有属性为null,大概率是返回的JSON字段名与类属性名不匹配,或者反序列化配置未适配JSON的命名规则。
具体排查与解决步骤
1. 匹配JSON与类属性的命名风格
从你提供的JSON截图来看,返回的JSON字段采用驼峰命名(如statusCode、isSuccess),而APIResponse类属性是帕斯卡命名(首字母大写,如StatusCode、IsSuccess)。Newtonsoft.Json默认不会自动映射两种命名风格,导致无法匹配赋值。
解决方法一:给类属性添加JsonProperty特性
直接指定每个属性对应的JSON字段名:
public class APIResponse { [JsonProperty("statusCode")] public HttpStatusCode StatusCode { get; set; } [JsonProperty("isSuccess")] public bool IsSuccess { get; set; } = true; [JsonProperty("errorMessages")] public List<string> ErrorMessages { get; set; } [JsonProperty("result")] public object Result { get; set; } }
解决方法二:全局配置驼峰命名解析器
如果项目中大量接口返回驼峰JSON,可以在反序列化时配置全局规则,避免逐个添加特性:
var apiContent = await apiResponse.Content.ReadAsStringAsync(); var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var APIResponse = JsonConvert.DeserializeObject<T>(apiContent, settings);
2. 检查StatusCode的类型兼容性
确认JSON中statusCode字段的类型:
- 如果是数字(如
200):HttpStatusCode枚举可直接匹配,无需额外配置。 - 如果是字符串(如
"OK"):需添加StringEnumConverter支持字符串到枚举的转换:
[JsonProperty("statusCode")] [JsonConverter(typeof(StringEnumConverter))] public HttpStatusCode StatusCode { get; set; }
3. 优化Result属性的强类型处理
当前Result为object类型,反序列化后会变成JObject,后续转成BlogPostListModel需手动处理。建议将APIResponse改为泛型类,直接获取强类型结果:
public class APIResponse<T> { [JsonProperty("statusCode")] public HttpStatusCode StatusCode { get; set; } [JsonProperty("isSuccess")] public bool IsSuccess { get; set; } = true; [JsonProperty("errorMessages")] public List<string> ErrorMessages { get; set; } [JsonProperty("result")] public T Result { get; set; } }
调用时直接指定泛型参数:
// 控制器代码 var response = await _blogService.GetAllAsync<APIResponse<BlogPostListModel>>(); if(response.IsSuccess) { BlogPostListModel list = response.Result; // 后续业务逻辑 }
4. 验证JSON结构完整性
确认返回的JSON没有额外嵌套层级(比如外层包裹了data或其他对象),如果有,需要调整类结构或先解析外层对象再提取目标数据。
内容的提问来源于stack exchange,提问作者whisk
相关产品推荐
相关产品推荐

