如果JSON有斜线,则JSON.parse引发错误

时间:2018-07-04 14:16:54

标签: javascript json vuejs2

我有一个使用PHP var json = <?php echo json_encode(['somearray']); ?>生成的有效JSON。

在此数组中,我有一个html字符串,如下所示:

$myArray = ['image' => '<img src="/img/files/icon3.png" alt="" title="" />'];
json_encode($myArray);

由于某种原因,当我将上述json发送到JSON.parser时,我不断收到意外的令牌错误"SyntaxError: Unexpected token / in JSON at position XYZ"


示例

var json = '[{"id":8,"type":"dataFiles","name":"Noise Data Files","selected":{"data":{"id":1,"subscription_id":"3","filestorage_id":"1","title":"test 1","graph_type":"line chart","settings":{"band":"broadband","interval":"long","measurement":"1","time_interval":"","frequency":"","param":"","display":""},"created_at":"2018-07-03 21:46:08","updated_at":"2018-07-03 21:46:08","created_by":"5","page":"1","picture":"customers/3/dataviewer/nKvvMkRbKcU53mkflUdqIe8VUaRrM83EqpsiPNuc.png","pivot":{"project_element_id":"4","dataviewer_id":"1"},"type":"<img src=\"/img/dataviewer/icon.png\" alt=\"3\" title=\"Third\" />","name":"00014_C_110609_240118 (1).csv","instrument":"dBAir","serial_number":"67600","recorded_on":"2024-01-18 11:06:09"}},"set":true},{"id":2,"type":"freeText","name":"Free Text","selected":"Some text","set":true}]';

JSON.parse(json);

3 个答案:

答案 0 :(得分:0)

*编辑:我不得不重新安装我的php服务器,以便可以验证这一点,但是我怀疑您正在这样做:

<script> 
  var json = '<?php echo json_encode($myArray); ?>';
  JSON.parse(json);
</script>

事实是,当您像这样直接在HTML中回显json_encode时,根本不需要JSON.parse,并且您也不想尝试使其成为字符串。删除引号,您的var json实际上是对象,而不是字符串。像这样:

<script> 
  var myArray = <?php echo json_encode($myArray); ?>;
</script>

请注意,<? ... ?>周围没有引号。同样,myArray不会是字符串,而是一个数组。

答案 1 :(得分:0)

您的问题与JSON序列化无关,甚至与JSON无关。问题是您要将其作为字符串文字粘贴在代码中。

当您在JavaScript字符串文字中(例如,在您的代码中)使用反斜杠\时,例如,它用作转义字符,\n会解析为换行符。

console.log('line 1 \n line 2`);

在您的情况下,您不必要地尝试使用\/来转义正斜杠,因为您一开始并没有转义反斜杠。也就是说,要将JSON直接包含在代码中,就像包含反斜杠的任何字符串一样,您将必须将反斜杠加倍以首先有效地取消反斜杠的转义。

因此,在您的字符串文字中,\/变成了\\/

如果直接从服务器加载JSON,那么这都不是问题。这只是一个问题,因为您已将其粘贴到代码中。

答案 2 :(得分:0)

我必须对通过PHP发送到javascript的JSON执行JSON.stringify()。之后,/和其他令牌的问题消失了。