Intereting Posts
Фильтровать массив по первой букве Как я могу запустить команду linux из скрипта PHP Объединение двух массивов по индексу codeigniter разрешает «http: //» в переменной get Laravel – комментарии Blade, обработка клинка, приводящая к сбою страницы Пытаться отобразить адрес сущности из базы данных с веточкой Регулярное выражение PHP с кавычками Получение динамического вывода HTML из другой страницы на сервере (возможно, file_get_contents) Как я должен повторять строковую переменную PHP, которая содержит специальные символы? Исходный код PHP base64 не правильно декодирован в Javascript Ошибки PHP -> Предупреждение: mysqli_stmt :: execute (): Не удалось получить mysqli_stmt | Предупреждение: mysqli_stmt :: close () Zend Framework на nginx как отправить png изображение с сервера для отображения в браузере через ajax Получить идентификатор из пули Laravel 4 Может ли php прослушивать изменение или обновление базы данных mysql? … мышление в реальном времени, живой поиск здесь

Проблема с json_decode PHP

Я получаю json-массив из python как возврат curl_exec в PHP (первый json PHP -> python, который возвращает другой json), и декодирование завершилось неудачно из-за плохого синтаксиса. Полученный json действителен, но каким-то образом, если я передам этот json для строки и распечатывает его, я получаю строку с 29 символами, но если я печатаю strlen ((string) $ my_json), то он говорит 50.

Вот код:

$results = curl_exec($ch); curl_close($ch); var_dump(json_decode($results)); 

И это возвращает NULL. Если я сделаю следующее

 echo (string)$results; 

Он печатает [[11, «stuffstuf», «stuffs»]] (29 символов), который является допустимым json. Но если я это сделаю

 echo strlen((string)$results); 

Он печатает 50.

Итак, я не знаю, что происходит. Любые мысли будут оценены =)

Может быть, у вас есть некоторые html-теги вокруг него, которые вы не видите при выполнении простого эха?

Попробуйте: echo htmlentities((string)$results); чтобы увидеть больше или проверить источник html страницы.

Если json_decode() терпит неудачу, это означает, что строка не является стандартным JSON.

Вы также можете использовать json_last_error_msg (), чтобы выяснить, почему он возвращает NULL. Это вернет сообщение об ошибке, если в json_decode произошла ошибка.

Ответ Seldaek был большой помощью, и я считаю, что это лучший ответ.

Я столкнулся с аналогичной проблемой, вызванной использованием одинарных кавычек вместо двойных кавычек, а также различиями между последней поддерживаемой версией PHP в Red Hat и PHP 5.5 на Ubuntu.

PHP на RHEL возвратил «Недопустимый или некорректный JSON» при чтении этой следующей строки из файла, где это было хорошо на моем экземпляре Ubuntu PHP 5.5.

 { 'book': 'Dune', 'author': 'Frank Herbert', 'ISBN-13': '978-0441172719' } 

Переход на двойные кавычки, как показано ниже, разрешил мою проблему

 { "book": "Dune", "author": "Frank Herbert", "ISBN-13": "978-0441172719" } 

Seldaek сказал, что использование json_last_error очень хорошее. Я также использую stripslashes перед json_decode . Вот мой код:

 $resp = stripslashes($resp); $resp_json = json_decode($resp); switch(json_last_error()) { case JSON_ERROR_DEPTH: echo ' - Maximum stack depth exceeded'; break; case JSON_ERROR_CTRL_CHAR: echo ' - Unexpected control character found'; break; case JSON_ERROR_SYNTAX: echo ' - Syntax error, malformed JSON'; break; case JSON_ERROR_STATE_MISMATCH: echo ' - Invalid or malformed JSON'; break; case JSON_ERROR_UTF8: echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; break; } 

После этого, когда вы debug и вы все еще допустите ошибку 4 – JSON_ERROR_SYNTAX. получите VALUE переменной $resp в режиме отладки и вставьте его в бесплатный веб-инструмент для преобразования JSON @ Json conversion check – jsonlint . И проверьте, в чем заключена сделка с конверсией.

его можно распечатать json_last_error_msg (), который дает ошибку в текстовом формате, а не в коде. Поэтому нет необходимости использовать управление коммутаторами и ошибками.