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

ASP.NET C# WebAPI中JsonConvert.SerializeObject异常转义数组问题

问题原因
  • 你的数据库中ExcelTableOne字段本身存储的就是已经序列化完成的JSON字符串,而非原生的数组/对象结构
  • 调用JsonConvert.SerializeObject(dt)对整个DataTable做序列化时,序列化器会把ExcelTableOne识别为普通字符串,自动对字符串内的双引号、反斜杠等特殊字符做转义处理,相当于对该字段的JSON内容做了二次序列化,最终就出现了你看到的多层转义的异常结果。
解决方案

方案1:后端预处理(推荐)

序列化整体结果前,先把预序列化的ExcelTableOne字段反序列化为原生JSON结构,再做整体序列化,即可避免二次转义,修改后的代码如下:

public string Get()
{
    string sqlQuery = "SELECT TOP 60 * FROM tb_HandoverDetails ORDER BY SubmittedDateTimeUTC DESC";
    SqlDataAdapter da = new SqlDataAdapter(sqlQuery, conn);
    DataTable dt = new DataTable();
    da.Fill(dt);
    if (dt.Rows.Count > 0)
    {
        // 预处理预序列化的JSON字段
        foreach(DataRow row in dt.Rows)
        {
            string rawJsonStr = row["ExcelTableOne"].ToString().Trim('"'); // 去掉首尾多余的引号
            row["ExcelTableOne"] = JsonConvert.DeserializeObject(rawJsonStr);
        }
        return JsonConvert.SerializeObject(dt);
    }
    else
    {
        Response.StatusCode = 400;
        return "no data found";
    }
}

方案2:前端临时兼容

如果暂时无法修改后端代码,前端可以通过两次JSON.parse解析异常字段实现兼容,不建议作为长期方案:

// 仅做临时兼容使用
async function fetchData() {
  const resp = await fetch('/your/api/path');
  const list = await resp.json();
  return list.map(item => {
    // 两次解析处理二次转义的内容
    item.ExcelTableOne = JSON.parse(JSON.parse(item.ExcelTableOne));
    return item;
  })
}
优化建议

如果业务允许,建议后续调整存储逻辑:

  • 优先使用数据库自带的JSON类型字段存储结构化内容,读取时可直接映射为对象,无需手动处理序列化
  • 复杂结构也可以拆分为关联表存储,避免在单字段内存储序列化字符串,减少后续序列化、查询的复杂度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:57:00