JSON.parse выдает ошибку, если в json есть слэши - PullRequest
0 голосов
/ 04 июля 2018

У меня есть правильный JSON, который был сгенерирован с использованием PHP var json = <?php echo json_encode(['somearray']); ?>.

В этом массиве у меня есть 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 голосов
/ 04 июля 2018

Ваша проблема не имеет никакого отношения к вашей сериализации JSON, и даже не касается того, что это вообще JSON. Проблема в том, что вы вставляете это в свой код как строковый литерал.

Если у вас есть обратный слеш \ в строковом литерале JavaScript (т. Е. В вашем коде), он служит в качестве escape-символа, например, \n преобразуется в новую строку.

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

В вашем случае вы без необходимости пытаетесь избежать косой черты с помощью \/, потому что вы не избежали этой обратной косой черты. То есть, чтобы поместить JSON непосредственно в ваш код, как и для любой строки, содержащей обратную косую черту, вам придется удвоить обратную косую черту, чтобы эффективно отменить экранирование обратной косой черты.

Итак, \/ становится \\/ в вашем строковом литерале.

Ничего из этого не является проблемой, если вы загружаете JSON напрямую с сервера. Это только проблема, потому что вы вставили его в свой код.

0 голосов
/ 04 июля 2018

Мне пришлось выполнить JSON.stringify () для JSON, который был отправлен в javascript через PHP. После чего проблема с / и другими токенами исчезла.

0 голосов
/ 04 июля 2018

* Редактировать: мне пришлось переустановить свой php-сервер, чтобы я мог проверить это, но я подозреваю, что вы делаете это:

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

Дело в том, что когда вы вводите json_encode прямо в HTML, как это, вам вообще не нужен JSON.parse, и вы не хотите пытаться сделать его строкой. Потеряйте кавычки, и ваш var json будет фактически объектом, а не строкой. Как это:

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

Обратите внимание на отсутствие кавычек вокруг <? ... ?>. И снова, myArray не будет строкой, это будет массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...