Проблема с json_decode PHP - PullRequest
5 голосов
/ 13 июня 2011

Я получаю массив 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.

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

Ответы [ 4 ]

17 голосов
/ 13 июня 2011

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

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

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

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

1 голос
/ 01 апреля 2014

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

Я столкнулся с похожей проблемой, вызванной использованием одинарных кавычек вместо двойных кавычек, и разницей между последнимиподдерживаемая версия 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" }
0 голосов
/ 31 октября 2015

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

0 голосов
/ 29 августа 2013

Селдаек сказал правильно, использование 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 - jsonlint .И выясните, в чем дело с вашей конверсией.

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