ASP.NET中JSON反序列化异常 实体数据未正确填充
问题根因
反序列化失败的核心原因是API返回了双重序列化的JSON内容:接口先将业务对象序列化为JSON数组字符串,又将该字符串作为普通值再次执行JSON序列化,最终返回的内容外层包裹引号、内部引号全部带转义反斜杠。
你当前直接将返回值反序列化为List<IncidentModel>时,解析器无法将字符串类型的内容直接映射为对象列表,只会生成包含通用元数据的未正确映射的结构,和你观测到的现象完全吻合。
另外你的模型中AdditionalInfoList属性为大驼峰命名,和返回JSON中的小驼峰字段additionalInfoList存在命名差异,也可能导致属性值填充失败。
修复方案
方案1:客户端适配(不需要修改接口代码)
执行两次反序列化:第一次解析外层包裹的字符串,拿到真实的未转义JSON数组内容;第二次将真实JSON映射为目标模型列表,同时配置反序列化规则兼容命名差异。
修正后的业务代码如下:
public async Task<JsonResult> OnGetIncidentsAsync() { List<IncidentModel> incidents = new List<IncidentModel>(); using (var httpClient = new HttpClient()) { using (HttpResponseMessage response = await httpClient.GetAsync("api/Incident/GetAllIncidents.json/")) { string apiResponse = await response.Content.ReadAsStringAsync(); // 第一步:反序列化外层包装,拿到真实JSON数组字符串 string unescapedJson = JsonConvert.DeserializeObject<string>(apiResponse); // 配置反序列化规则:自动匹配驼峰命名差异 var jsonSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; // 第二步:反序列化真实JSON到目标模型列表 incidents = JsonConvert.DeserializeObject<List<IncidentModel>>(unescapedJson, jsonSettings); } } return new JsonResult(incidents); }
如果你不想全局配置驼峰解析,也可以直接在模型类的属性上添加特性映射JSON字段名,示例如下:
using Newtonsoft.Json; public class IncidentModel { public string id { get; set; } public string referenceID { get; set; } [JsonProperty("additionalInfoList")] public List<string> AdditionalInfoList { get; set; } }
方案2:接口端修复(可彻底解决问题)
如果你有权限修改API接口代码,直接移除接口端多余的一次JSON序列化逻辑,直接返回对象数组的序列化结果即可,客户端无需做两次反序列化适配。
注意:不要手动通过字符串替换的方式处理转义字符,不同边界场景下容易出现解析错误,使用JSON序列化器自带的两次反序列化逻辑容错率更高。
内容的提问来源于stack exchange,提问作者Robert Rachita
相关产品推荐
相关产品推荐

