Почему это не будет работать для меня?
<script> JSON.parse(<?php echo json_encode(array('test123', 'test456')); ?>); </script>
Я получаю эту ошибку:
SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data
PHP json_encode
создает строку, но это фактическая строка в памяти, а не одна в синтаксисе PHP, поэтому она не завернута в кавычки при echo
. Когда он отражается в контексте кода JavaScript, он выводит совершенно корректный JSON, но интерпретатор JS не будет рассматривать его как строку, потому что он не заключен в кавычки. Без них JS видит массив, обозначенный в литеральном синтаксисе (поскольку JSON берет свой собственный синтаксис из подмножества синтаксиса JS literal). Таким образом, попытка проанализировать это вызовет ошибку.
Если ваш код запущен, это то, что действительно отображается в исходном источнике:
<script> var obj = ["test123", "test456"]; </script>
Поскольку obj
теперь содержит массив (который был обозначен в синтаксисе JS literal), запуск его через JSON.parse
приведет к ошибке.
Подумайте об этом, как предложение, которое вы написали в строке на PHP, затем повторилось:
<?php $sentence = 'I like beer.': echo $sentence; ?>
Это даст результат:
I like beer.
Обратите внимание на отсутствие кавычек. Теперь, представьте себе, чтобы написать кусок JSON «вручную» и повторить его:
<?php $json = '{"foo": "bar"}': echo $json; ?>
Это приведет к выводу:
{"foo": "bar"}
Опять же, обратите внимание на отсутствие кавычек. Это присвоение переменной $json
создает те же строковые данные в PHP, что и ваш вызов json_encode
. Таким образом, повторение вывода вашего вызова также не приводит к кавычкам.
Теперь посмотрим на этот последний выходной кусок – что мог бы сделать движок JavaScript, если он столкнулся с чем-то подобным?
Итак, чтобы разобрать JSON.parse
, вам нужно что-то, что JS будет интерпретировать как строку во время анализа синтаксиса JS. Если вы завернули свой PHP в одинарные кавычки как таковые:
<script> var obj = '<?php echo json_encode(array('test123', 'test456')); ?>'; </script>
Тогда выход будет:
<script> var obj = '["test123", "test456"]'; </script>
Поскольку это строка в правильном формате, теперь она JSON и может быть передана JSON.parse
.
( Примечание. Просто обертка в одинарных кавычках небезопасна, поскольку структура, в которой закодирована PHP, может содержать строку, в которой содержится одна цитата. Это приведет к синтаксической ошибке в вашем JavaScript.)
Как уже упоминалось, ничто из этого не требуется в любом случае – вы можете передать JS вашему без кавычки JSON и пропустить синтаксический анализ, потому что интерпретатор JS будет анализировать его как есть и сохранить вам шаг. Я просто хотел, чтобы вы поняли механиков. Надеюсь, я тебя не смутил … 🙁
JavaScript – единственный язык, на котором прямой вывод JSON в контекст, который делает его более не строкой, может фактически создать что-то работоспособное. Это связано с тем, что синтаксис JSON берется из подмножества синтаксиса литерала JavaScript.
Контекст – все в этом. Например, отправка JSON на JavaScript поверх AJAX отличается от контекста, который вы указали для того, чтобы попытаться дать JavaScript некоторую JSON. В случае AJAX ответ от сервера на AJAX-код уже является строкой JS в памяти. Принимая во внимание, что PHP-эхо-код в JS-коде генерирует синтаксис для синтаксического анализа JS-движком, для этого нужны кавычки, чтобы сделать его строкой.
JSON уже имеет Javascript, поэтому JSON.parse
здесь не нужен. Следующее должно работать без проблем:
<script> var obj = <?php echo json_encode(array('test123', 'test456')); ?>; </script>
Это приведет к следующему источнику на странице (который отлично подходит JSON и Javascript):
<script> var obj = ["test123", "test456"]; </script>
Прямой ответ : поскольку вышеупомянутое не отвечает на ваш вопрос технически, JSON.parse
предназначен для работы со строками. Вы не даете ему строку, вы даете ей объект (поскольку снова JSON является действительным javascript). JSON.parse
должен работать нормально, если вы действительно поместите значение в одинарные кавычки, но вам нужно убедиться, что он экранирован должным образом (одинарные кавычки внутри одинарных кавычек, очевидно, вызовут проблемы). Но я бы не стал разбираться с JSON в качестве строки, учитывая, что в этом случае это не нужно.
Я думаю, вам нужно поставить вывод PHP между кавычками ""
Попробуй это:
<script> JSON.parse("<?php echo json_encode(array('test123', 'test456')); ?>"); </script>