JSON.parse解析字符串报语法错误但在线校验正常,如何解析并移除转义引号?
问题解决思路与方案
你遇到的问题根源有两个:一是这段内容是两个独立的JSON对象直接拼接,并非合法的JSON数组,直接用JSON.parse会触发语法错误;二是第二个对象里的content字段是双重转义的JSON字符串,需要多层解析才能拿到真实数据。以下是具体解决步骤:
步骤1:修复顶层JSON结构
将两个独立的JSON对象用逗号分隔,外层包裹数组括号[],转换成合法的JSON数组:
[ {"bubbles":false,"cancelBubble":false,"cancelable":false,"currentTarget":{},"data":"{\"id\":5,\"channel\":\"private_Mgfj2W80CIQDhgu4SjOeQci3LLVZdDD-dcY339RIZP0\",\"text\":{\"content\":{\"m\":\"alert_fired\",\"p\":{\"fire_id\":14567916611,\"sound_file\":null,"symbol\":\"FX:EURUSD\",\"cross_interval\":false,"popup":false,"message\":\"BUY\",\"alert_id\":786895183,\"sound_duration\":0,"fire_time\":\"2023-03-31T15:20:00Z\",\"name\":\"test: при любом вызове функции alert()\",\"resolution\":\"1\",\"bar_time\":\"2023-03-31T15:20:00Z\"},\"id\":\"57wy-8828807\"},\"channel\":\"pricealerts\"}}","defaultPrevented":false,"eventPhase":2,"lastEventId":"","origin":"wss://pushstream.tradingview.com","path":[],"ports":[],"returnValue":true,"source":null,"srcElement":{},"target":{},"timeStamp":44258.30000000028,"type":"message"}, {"bubbles":false,"cancelBubble":false,"cancelable":false,"currentTarget":{},"data":"{\"id\":6,\"channel\":\"private_Mgfj2W80CIQDhgu4SjOeQci3LLVZdDD-dcY339RIZP0\",\"text\":{\"content\":\"{\\\"m\\\":\\\"event\\\",\\\"p\\\":{\\\"id\\\":14567916611,\\\"aid\\\":786895183,\\\"fire_time\\\":1680276000,\\\"bar_time\\\":1680276000,\\\"sym\\\":\\\"FX:EURUSD\\\",\\\"res\\\":\\\"1\\\",\\\"desc\\\":\\\"BUY\\\",\\\"snd_file\\\":\\\"alert\\/fired\\\",\\\"snd\\\":false,\\\"popup\\\":false,\\\"cross_int\\\":false,\\\"name\\\":\\\"test: при любом вызове функции alert()\\\",\\\"snd_duration\\\":0}}\",\"channel\":\"alert\"}}","defaultPrevented":false,"eventPhase":2,"lastEventId":"","origin":"wss://pushstream.tradingview.com","path":[],"ports":[],"returnValue":true,"source":null,"srcElement":{},"target":{},"timeStamp":44261.30000000028,"type":"message"} ]
步骤2:多层解析嵌套的转义JSON
data字段本身是转义后的JSON字符串,需要先解析一次;第二个对象的content是双重转义的字符串,得再解析一次。以下是JavaScript代码示例:
// 赋值修复后的合法JSON数组字符串 const fixedJsonStr = `[ {"bubbles":false,"cancelBubble":false,"cancelable":false,"currentTarget":{},"data":"{\"id\":5,\"channel\":\"private_Mgfj2W80CIQDhgu4SjOeQci3LLVZdDD-dcY339RIZP0\",\"text\":{\"content\":{\"m\":\"alert_fired\",\"p\":{\"fire_id\":14567916611,\"sound_file\":null,"symbol\":\"FX:EURUSD\",\"cross_interval\":false,"popup":false,"message\":\"BUY\",\"alert_id\":786895183,\"sound_duration\":0,"fire_time\":\"2023-03-31T15:20:00Z\",\"name\":\"test: при любом вызове функции alert()\",\"resolution\":\"1\",\"bar_time\":\"2023-03-31T15:20:00Z\"},\"id\":\"57wy-8828807\"},\"channel\":\"pricealerts\"}}","defaultPrevented":false,"eventPhase":2,"lastEventId":"","origin":"wss://pushstream.tradingview.com","path":[],"ports":[],"returnValue":true,"source":null,"srcElement":{},"target":{},"timeStamp":44258.30000000028,"type":"message"}, {"bubbles":false,"cancelBubble":false,"cancelable":false,"currentTarget":{},"data":"{\"id\":6,\"channel\":\"private_Mgfj2W80CIQDhgu4SjOeQci3LLVZdDD-dcY339RIZP0\",\"text\":{\"content\":\"{\\\"m\\\":\\\"event\\\",\\\"p\\\":{\\\"id\\\":14567916611,\\\"aid\\\":786895183,\\\"fire_time\\\":1680276000,\\\"bar_time\\\":1680276000,\\\"sym\\\":\\\"FX:EURUSD\\\",\\\"res\\\":\\\"1\\\",\\\"desc\\\":\\\"BUY\\\",\\\"snd_file\\\":\\\"alert\\/fired\\\",\\\"snd\\\":false,\\\"popup\\\":false,\\\"cross_int\\\":false,\\\"name\\\":\\\"test: при любом вызове функции alert()\\\",\\\"snd_duration\\\":0}}\",\"channel\":\"alert\"}}","defaultPrevented":false,"eventPhase":2,"lastEventId":"","origin":"wss://pushstream.tradingview.com","path":[],"ports":[],"returnValue":true,"source":null,"srcElement":{},"target":{},"timeStamp":44261.30000000028,"type":"message"} ]`; // 解析顶层JSON数组 const topLevelArray = JSON.parse(fixedJsonStr); // 遍历处理每个对象,解析嵌套的转义内容 const parsedResult = topLevelArray.map(item => { // 解析data字段的转义JSON const dataObj = JSON.parse(item.data); // 检查content是否为字符串(双重转义情况),是则再次解析 if (typeof dataObj.text.content === 'string') { dataObj.text.content = JSON.parse(dataObj.text.content); } // 返回替换data后的对象 return { ...item, data: dataObj }; }); console.log(parsedResult);
补充说明
- 在线校验工具通常只检查单个JSON对象的合法性,不会识别两个对象拼接的问题,所以会显示无异常。
- 解析过程会自动移除所有转义引号,最终得到完整的JSON结构。
内容的提问来源于stack exchange,提问作者Евгений Горобцов
相关产品推荐
相关产品推荐

