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

如何转义字符串化对象中的双引号以成功解析为合法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);
    
  • 视图输出代码示例:
    <script>
      // 序列化结果本身就是合法JS对象字面量,可直接赋值,不需要额外JSON.parse
      const myList = @Html.Raw(ViewBag.MyListJson);
    </script>
    
    按这个方案处理后,你提到的Example4字段会自动输出为期望的合法格式:
    "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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:06:21