如何仅替换外层双引号,保留内层转义以生成合法JSON?
解决方案:仅转义JSON字符串值内的嵌套双引号
针对你遇到的JSON字符串中嵌套双引号未转义、全局替换会破坏结构的问题,可通过正则匹配+局部替换的方式精准处理值内的嵌套双引号,而非全局替换所有双引号。
核心思路
JSON结构中,双引号主要有两种作用:
- 外层双引号:包裹键名或字符串值(属于JSON结构的边界符号)
- 内层嵌套双引号:字符串值内部的内容,需要转义为
\"才能保证JSON合法
我们需要精准识别字符串值内部的未转义双引号,仅对其进行转义处理。
通用正则方案(以JavaScript为例)
使用正则匹配JSON中的所有字符串片段(被"包裹的内容),再对每个片段内部的双引号单独转义:
const originalStr = '{"id":"apache "obsolete" version","instances":2}'; const processedStr = originalStr.replace(/"([^"\\]*(?:\\.[^"\\]*)*)"/g, (match, content) => { // 仅对字符串内容里的双引号转义 return '"' + content.replace(/"/g, '\\"') + '"'; }); console.log(processedStr);
执行后输出:
{"id":"apache \"obsolete\" version","instances":2}
SQL场景方案(以PostgreSQL为例)
如果是在数据库中处理这类字符串,可使用regexp_replace结合正则分组实现:
SELECT regexp_replace( '{"id":"apache "obsolete" version","instances":2}', '(")([^"\\]*(?:\\.[^"\\]*)*)(")', '\1' || regexp_replace('\2', '"', '\\\\"', 'g') || '\3', 'g' );
该语句会匹配所有被"包裹的字符串片段,仅对片段内部的双引号进行转义,最终输出符合预期的JSON格式字符串。
注意事项
- 若原始字符串中已有部分转义的双引号(如
\"),上述正则会自动忽略已转义的内容,不会重复转义 - 复杂JSON结构(如嵌套对象、数组)同样适用该方案,因为正则会匹配所有字符串值片段
内容的提问来源于stack exchange,提问作者llanato
相关产品推荐
相关产品推荐

