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

JSON处理含双引号字符串时解析报错及eval使用异常如何解决?

问题根因

  • 所有报错的核心是转义符双重消费冲突:JSON.stringify输出的JSON字符串中用于转义双引号的\,会先被外层JS字符串字面量的解析规则提前消费,最终传入JSON.parse的内容丢失转义符,格式非法。
  • 你遇到的几个场景都是同一逻辑:JSON.stringify(['"d"'])输出的原始JSON为["\"d\""],当它被嵌入单引号包裹的JS字符串时,\"会被JS直接解析为普通双引号,最终传入JSON.parse的内容变为[""d""],触发语法错误。
  • 直接赋值var someJson='["\"d\""]'时的自动修改也是同理:JS字符串字面量的转义规则会先消费掉\,变量实际存储的内容没有转义符,自然无法被JSON.parse识别。

修复方案

可修改第三方库代码时

直接删除无意义的eval套娃逻辑,JSON.stringify返回的是合法JSON字符串,直接调用JSON.parse即可还原原对象:

// 替换原有错误逻辑
// window.eval(`JSON.parse('${JSON.stringify(t)}')`)
// 改为
const res = JSON.parse(JSON.stringify(t))

如果必须保留eval写法,不要将JSON字符串包裹在单/双引号中传递,可利用JSON本身是合法JS字面量的特性直接解析,或对JSON做二次转义:

// 方案1:直接解析合法JS字面量
const res = window.eval(JSON.stringify(t))
// 方案2:二次转义后再传入JSON.parse
const res = window.eval(`JSON.parse(${JSON.stringify(JSON.stringify(t))})`)

不可修改第三方库代码时

对入参t中的字符串做二次转义,抵消eval的转义消费:

// 处理入参中的所有字符串
const processedT = t.map(item => typeof item === 'string' ? item.replaceAll('"', '\\"') : item)
// 传入第三方库调用
thirdPartyFunc(processedT)

临时测试快速修复

如果只是需要快速测试单一场景,给转义符额外加一层转义即可,或用String.raw避免JS提前消费转义符:

// 原错误写法
JSON.parse('["\"d\""]')
// 修复方案1:额外加转义
JSON.parse('[\\"\\\\\\"d\\\\\\"\\"]')
// 修复方案2:用String.raw
JSON.parse(String.raw`["\"d\""]`)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:57:03