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

如何转换并解析格式错误的文本以适配JSON.parse?

解决含内嵌单引号的类JSON字符串转合法JSON的问题

这种半吊子的类JSON格式真的很让人头疼——全替换单引号肯定踩坑,因为值里的单引号会直接把双引号的结构搞崩。我之前处理过类似的场景,核心思路是只替换那些作为键/值边界的单引号为双引号,保留值内部的单引号不动,这样就能生成合法的JSON了。

问题根源

你直接用replace(/'/g, '"')会把值里的'quoted'变成"quoted",导致整个字符串变成:

{"key1":"val","key2":"bad_val with "quoted" text"}

嵌套的双引号直接违反JSON语法,自然解析失败。

解决方案:精准匹配边界单引号

我们需要用正则表达式区分两种单引号:

  • 边界单引号:用来包裹键或值的单引号,比如'key1'、'val'前后的单引号
  • 内嵌单引号:值内容里的单引号,比如bad_val with 'quoted' text里的单引号

只把边界单引号替换成双引号,内嵌单引号保留不动,就能得到合法的JSON。

具体代码实现

// 假设你的问题字符串是这个(实际使用时确保原字符串在JS中合法,比如用反引号包裹)
const badStr = `{'key1':'val','key2':'bad_val with 'quoted' text'}`;

// 精准替换边界单引号为双引号
const validJsonStr = badStr.replace(/(?<=[:{,]\s*)'(?=[^'])|'(?=\s*[},])/g, '"');

// 现在可以正常解析了
const parsedData = JSON.parse(validJsonStr);
console.log(parsedData.key2); // 输出: bad_val with 'quoted' text

正则表达式解释

  • (?<=[:{,]\s*):反向断言,匹配前面是:、{或,(可能带空格)的位置,确保这是字符串的起始边界
  • '(?=[^']):正向断言,匹配单引号后不是单引号的情况,避免误匹配值内部的连续单引号
  • '(?=\s*[},]):正向断言,匹配单引号后是空格+}或,的位置,确保这是字符串的结束边界

特殊情况覆盖

  • 如果字符串里有转义的单引号(比如\'),替换后会变成普通单引号,这在JSON中是合法的,无需额外处理
  • 嵌套对象结构(比如{'key':{'subkey':'val with 'quoted' text'}})也能被正确处理,正则会匹配所有层级的边界单引号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:22:22