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

