JavaScript中替换JSON嵌套双引号为单引号的解决方法
解决JSON嵌套双引号导致解析失败的问题
哈哈,这个坑我踩过!JSON解析器对引号的规则特别严格,你这里的问题是userAgent字段值里的嵌套双引号(比如sAgkey::"")让解析器误以为字符串提前结束了,直接报错。咱们可以用正则表达式精准替换掉这些内部的双引号,同时保留JSON结构本身的双引号。
方法一:通用替换(处理所有字符串字段内的双引号)
这个方法会遍历JSON里所有双引号包裹的字段值,把值内部的双引号全部替换成单引号,不会破坏JSON的整体结构:
// 先修正原始字符串里的语法错误(比如多余的""userAgent改成"userAgent") const faultyJson = '{"hexId":"123","version":5,"userAgent":"Mozilla/5.02.1.0 (Linux; U; Android 7.0; SM-G935S Build/NRD90M)|||sDid::ba83f40b-22e0-3992-a4d4-15b5d554790c|sAgkey::""|sAppkey::""|null|null|svcode::1221|sgIdKey::1631f8d9-3c1c-4020-a322-53f266ec9547","referer":"http://www.google.com.ar"}'; // 正则匹配所有JSON字符串字段,替换内部双引号为单引号 const fixedJson = faultyJson.replace(/"([^"\\]*(?:\\.[^"\\]*)*)"/g, (match, content) => { const replacedContent = content.replace(/"/g, "'"); return `"${replacedContent}"`; }); // 现在可以正常解析了 const parsedData = JSON.parse(fixedJson); console.log(parsedData.userAgent); // 输出:Mozilla/5.02.1.0 (Linux; U; Android 7.0; SM-G935S Build/NRD90M)|||sDid::ba83f40b-22e0-3992-a4d4-15b5d554790c|sAgkey::''|sAppkey::''|null|null|svcode::1221|sgIdKey::1631f8d9-3c1c-4020-a322-53f266ec9547
方法二:精准替换(只处理特定的嵌套双引号)
如果你确定只有sAgkey::""、sAppkey::""这类格式的嵌套双引号,可以用更针对性的正则,避免误替换其他可能的双引号:
const fixedJson = faultyJson.replace(/(sAgkey::|sAppkey::)""\|/g, '$1\'\'|');
小提醒
如果能从生成JSON的源头解决问题(比如把内部双引号转义成\")是最优解,但如果只能处理现有字符串,上面的方法就能完美解决你的问题。
内容的提问来源于stack exchange,提问作者justMiLa




