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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:18:16