Я получаю 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 (), который дает ошибку в текстовом формате, а не в коде. Поэтому нет необходимости использовать управление коммутаторами и ошибками.