如何转换并解析格式错误的文本以适配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ł
相关产品推荐
相关产品推荐

