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

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,提问作者Евгений Горобцов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:10:03