如何转义字符串化对象中的双引号以成功解析为合法JSON
问题根因
解析报错的核心原因是服务端输出的JSON本身结构不合法,不要在前端写转义函数补锅:当你拿到的JSON字符串已经因为未转义双引号破坏了结构时,前端正则无法100%区分“作为JSON语法边界的双引号”和“字段值里自带的双引号”,补转义的逻辑很容易出现误替换。
你当前用的Json.Encode属于旧版System.Web.Helpers下的序列化方法,存在特殊字符转义不全的问题,遇到字段值里自带的双引号时没有自动转义为\",才会输出"Example4":"vase pompe de flèche ATC T 16"","这种结构损坏的片段。
解决方案
方案1:替换服务端序列化逻辑(优先推荐,100%解决问题)
从序列化源头解决转义问题,不需要前端做任何额外处理:
- 弃用老旧的
Json.Encode方法,换成Newtonsoft.Json(Json.NET)或者.NET自带的System.Text.Json做序列化,这两个序列化器会自动处理字符串内的双引号、换行、制表符等特殊字符,输出完全符合规范的合法JSON。 - 后端代码示例:
// 用Newtonsoft.Json的场景 using Newtonsoft.Json; // 在Action方法中提前序列化好列表数据,传给视图 ViewBag.MyListJson = JsonConvert.SerializeObject(Model.MyList); // .NET Core/.NET 5+ 用自带System.Text.Json的场景 using System.Text.Json; ViewBag.MyListJson = JsonSerializer.Serialize(Model.MyList); - 视图输出代码示例:
按这个方案处理后,你提到的Example4字段会自动输出为期望的合法格式:<script> // 序列化结果本身就是合法JS对象字面量,可直接赋值,不需要额外JSON.parse const myList = @Html.Raw(ViewBag.MyListJson); </script>
不存在任何结构问题,可直接使用。"Example4":"vase pompe de flèche ATC T 16\"",
方案2:前端兜底修复(仅适用于无法修改服务端逻辑的场景,有局限性)
如果暂时不能调整服务端序列化逻辑,可针对固定结构的JSON做定向修复,注意该方案不适合复杂嵌套的JSON结构,存在误替换风险:
function fixBrokenJson(brokenJsonStr) { // 匹配所有"键":"值"结构,对值内未转义的双引号做转义 return brokenJsonStr.replace(/"([^"]+)":"([^"]*)"/g, (match, key, value) => { const escapedValue = value.replace(/(?<!\\)"/g, '\\"'); return `"${key}":"${escapedValue}"`; }); } // 调用示例 const validJson = fixBrokenJson(页面输出的原始损坏JSON字符串); const myList = JSON.parse(validJson);
避坑提醒
- 不要依赖前端转义修复损坏的JSON,只要服务端序列化逻辑正确,根本不需要前端做额外的转义处理。
- 不要在序列化完成后对JSON字符串做手动字符串替换,很容易破坏JSON结构。
- 用
@Html.Raw输出JSON时,必须确保序列化阶段已经处理完全部特殊字符,否则不仅会出现解析错误,还可能引发XSS安全问题。
内容的提问来源于stack exchange,提问作者Little_Dev
相关产品推荐
相关产品推荐

