json_decode возвращает NULL после вызова веб-сервиса - PullRequest
56 голосов
/ 27 марта 2009

С json_encode и json_decode наблюдается странное поведение, и я не могу найти решение:

Мое php-приложение вызывает php-веб-сервис. Веб-сервис возвращает json, который выглядит следующим образом:

var_dump($foo):
string(62) "{"action":"set","user":"123123123123","status":"OK"}"

Теперь мне нравится декодировать JSON в моем приложении:

$data = json_decode($foo, true)

но возвращается NULL:

var_dump($data):
NULL

Я использую php5. Content-Type ответа от веб-службы: "text/html; charset=utf-8" (также пытался использовать "application/json; charset=utf-8")

В чем может быть причина?

Ответы [ 20 ]

74 голосов
/ 04 февраля 2010

Ну, у меня была похожая проблема, и проблема заключалась в магических кавычках PHP на сервере ... вот мое решение:

if(get_magic_quotes_gpc()){
  $param = stripslashes($_POST['param']);
}else{
  $param = $_POST['param'];
}
$param = json_decode($param,true);
64 голосов
/ 27 марта 2009

EDIT: Просто сделал несколько быстрых проверок строки, предоставленной ОП. Маленький «символ» перед фигурной скобкой - это UTF-8 B (yte) O (rder) M (ark) 0xEF 0xBB 0xBF. Я не знаю, почему эта последовательность байтов отображается здесь как .

По сути, система, с которой вы собираете данные, отправляет их в кодировке UTF-8 с спецификацией, предшествующей данным. Вы должны удалить первые три байта из строки, прежде чем выбросить ее в json_decode() (подойдет substr($string, 3)).

string(62) "{"action":"set","user":"123123123123","status":"OK"}"
            ^
            |
            This is the UTF-8 BOM

Как обнаружил Куроки Казе , этот символ, несомненно, является причиной неудачи json_decode. Строка в заданной форме не является правильно отформатированной структурой JSON (см. RFC 4627 )

33 голосов
/ 31 мая 2010

Вывести последнюю ошибку json при отладке. json_decode( $so, true, 9 ); $json_errors = array( JSON_ERROR_NONE => 'No error has occurred', JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded', JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', JSON_ERROR_SYNTAX => 'Syntax error', ); echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL; Также используйте функцию json.stringify (), чтобы дважды проверить синтаксис JSON.

26 голосов
/ 25 октября 2011

Ни одно из приведенных выше решений не помогло мне, но html_entity_decode($json_string) справилось с задачей

19 голосов
/ 27 марта 2009

Попробуйте это

$foo = utf8_encode($foo);
$data = json_decode($foo, true);
7 голосов
/ 07 декабря 2011

убедитесь, что если вы отправили данные с помощью POST / GET, сервер не смог избежать кавычек

$my_array = json_decode(str_replace ('\"','"', $json_string), true);
5 голосов
/ 27 марта 2009
"{"action":"set","user":"123123123123","status":"OK"}"

Этот маленький апостроф в начале - что это? Первый символ после двойной кавычки.

4 голосов
/ 05 января 2012

У меня была похожая проблема на живом сайте. На моем местном сайте все работало нормально. Для исправления так же я просто добавил следующий код

json_decode(stripslashes($_GET['arr']));

4 голосов
/ 08 июня 2013

Я просто положил это

$result = mb_convert_encoding($result,'UTF-8','UTF-8'); 
    $result = json_decode($result);

и работает

3 голосов
/ 08 августа 2013

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

Конечно, лучше всего распечатать эту переменную и посмотреть, чем она станет после json_decode. Если она нулевая, вы также можете использовать функцию json_last_error () , чтобы определить ошибку, которая вернет целое число, Вот те, которые описаны INT:

0 = JSON_ERROR_NONE

1 = JSON_ERROR_DEPTH

2 = JSON_ERROR_STATE_MISMATCH

3 = JSON_ERROR_CTRL_CHAR

4 = JSON_ERROR_SYNTAX

5 = JSON_ERROR_UTF8

В моем случае я получил вывод json_last_error () как число 4 , так что JSON_ERROR_SYNTAX . Затем я пошел и посмотрел на строку, которую я сам хотел преобразовать, и она была в последней строке:

'\'title\' error ...'

После этого действительно просто исправить.

$json = json_decode(stripslashes($response));
if (json_last_error() == 0) { // you've got an object in $json}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...