Json decode php возвращает null

json_decode () возвращает null проблемы

У меня проблема с моим JSON. Он корректно работает в PHP 5.3 (поэтому я не могу использовать json_last_error ()), и он успешно возвращается, когда я скопирую строку явно в json_decode (json_decode (»). Он возвращает только null, когда я пропускаю результат как переменная, и я использую php 5.2, для чего мне это нужно.

Вывод происходит из записи JSON в PHPUnit:

[ < "event": "suiteStart", "suite": "", "tests": 2 >, < "event": "suiteStart", "suite": "TagTestCase", "tests": 2 >, < "event": "test", "suite": "TagTestCase", "test": "TagTestCase::test_it", "status": "fail", "time": 0.00248718261719, "trace": [ < "file": "\/UnitTest\/PHPUnit.php", "line": 98, "function": "run", "class": "PHPUnit_Framework_TestSuite", "type": "->", "args": [ < >] >, < "file": "\/UnitTest\/PHPUnit.php", "line": 116, "function": "run", "class": "PHPUnit", "type": "->", "args": [ ] >, < "file": "\/UnitTest\/PHPUnit.php", "line": 212, "function": "__tostring", "class": "PHPUnit", "type": "->", "args": [ ] > ], "message": "false assertionzzzzz.\nFailed asserting that is true." >, < "event": "test", "suite": "TagTestCase", "test": "TagTestCase::test_two", "status": "pass", "time": 0.00182914733887, "trace": [ ], "message": "" >] 

EDIT: Это пути, которые я изучал – возможно, вы лучший исследователь. Три возможных пути, которые могли бы помочь:

  • Чем отличается json_decode () в php 5.2, то 5.3? что они изменили?
  • Кто-то еще использует JSON из PHPUnit и как они анализируют его.
  • Что изменится, когда вы имеете его в переменной или распечатываете его на экране и копируете его в json_decode ()

Любая помощь будет очень (!) Оценена.

Какая УДОБНАЯ отладочная сессия. Хорошо, есть хорошие новости. Я понял это.

Читайте также:  Меняем цвет шрифта при помощи HTML

Я начал смотреть на него с помощью AJAX и записывать его с помощью Firebug … и получается, что json_decode (или eval между прочим) не может обрабатывать " , и это то, что PHPUnit отправляет обратно (Приходите на Себастьяна!), чтобы исправить это:

Теперь я думал, что они такие же … может, кто-то может просветить меня ..

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

Конечно, лучший способ – это порог, чтобы напечатать этот var out и посмотреть, что он будет после json_decode, если он равен null, вы также можете использовать функцию json_last_error (), чтобы определить ошибку, в которой он вернет целое число, но здесь описаны те int:

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

После этого это просто простое решение.

$json = json_decode(stripslashes($response)); if (json_last_error() == 0) < // you've got an object in $json> 

(используя PHPUnit 3.4.13), Файл, который он создает, не содержит действительных JSON,

json-файл содержит «json», который выглядит примерно так:

Вместо того, что я ожидаю увидеть:

Не уверен, что та же проблема, что вы видите, ваш образец JSON-вывода в вопросе выглядит более достоверным, чем то, что я вижу.

После добавления отсутствующих запятых и скобок он может быть проанализирован с помощью json_decode () на PHP 5.2.10 или PHP 5.3.2.

Попробуйте эту проблему, это html_entity_decode ($ ваше значение);

 if(get_magic_quotes_gpc())< $param = stripslashes($row['your column name']); >else < $param = $row['your column name']; >$param = json_decode(html_entity_decode($param),true); $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; print_r($param); 

Вы должны использовать это

$jsonstring = stripslashes(str_replace('\"', '"', $jsonstring)); 

Я тестировал это с помощью PHP 5.3

попробуйте установить отчет об ошибках во ВСЕХ, json_decode () должен предоставить вам уведомление в смещении, где преобразование завершается с ошибкой.

Полезное сообщение от Себастьяна о формате json

Использование предложения Кейта позволит правильно анализировать данные

Я замечаю это поведение с PHP версии 5.14.12, и это может быть и для других версий.
При использовании file_get_contents для загрузки строки JSON в функцию json_decode мне пришлось снимать символы спецификации, то есть для UTF-8 EF BB BF, прежде чем она будет работать должным образом.
Сравните длины ваших двух строк – жестко закодированные по сравнению с переданными в переменной – если они не совпадают, эти символы могут быть виновниками.

Вы можете установить кодировку базы данных перед отправкой – решить проблемы на моем конце:

$sql = $mysqli->set_charset("utf8"); 

Источник

json_decode

Принимает закодированную в JSON строку и преобразует её в PHP-значение.

Список параметров

Строка ( string ) json для декодирования.

Функция работает только со строками в кодировке UTF-8.

Замечание:

PHP реализует надмножество JSON, который описан в первоначальном » RFC 7159.

Если true , объекты JSON будут возвращены как ассоциативные массивы ( array ); если false , объекты JSON будут возвращены как объекты ( object ). Если null , объекты JSON будут возвращены как ассоциативные массивы ( array ) или объекты ( object ) в зависимости от того, установлена ли JSON_OBJECT_AS_ARRAY в flags .

Максимальная глубина вложенности структуры, для которой будет производиться декодирование. Значение должно быть больше 0 и меньше или равно 2147483647 .

Битовая маска из констант JSON_BIGINT_AS_STRING , JSON_INVALID_UTF8_IGNORE , JSON_INVALID_UTF8_SUBSTITUTE , JSON_OBJECT_AS_ARRAY , JSON_THROW_ON_ERROR . Поведение этих констант описаны на странице JSON-констант.

Возвращаемые значения

Возвращает данные json , преобразованные в соответствующие типы PHP. Значения true , false и null возвращаются как true , false и null соответственно. null также возвращается, если json не может быть преобразован или закодированные данные содержат вложенных уровней больше, чем указанный предел вложенности.

Ошибки

Начиная с PHP 8.0.0, если значение параметра depth выходит за пределы допустимого диапазона, функция выбрасывает исключение ValueError ; ранее выдавалась ошибка уровня E_WARNING .

Список изменений

Версия Описание
7.3.0 Добавлена константа JSON_THROW_ON_ERROR для параметра flags .
7.2.0 associative теперь nullable.
7.2.0 Добавлены константы JSON_INVALID_UTF8_IGNORE и JSON_INVALID_UTF8_SUBSTITUTE для параметра flags .
7.1.0 Пустой ключ JSON («») будет преобразован в пустое свойство объекта, а не в свойство со значением _empty_ .

Примеры

Пример #1 Примеры использования json_decode()

var_dump ( json_decode ( $json ));
var_dump ( json_decode ( $json , true ));

Результат выполнения данного примера:

object(stdClass)#1 (5) < ["a"] =>int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) > array(5) < ["a"] =>int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) >

Пример #2 Доступ к свойствам объектов с неправильными именами

Доступ к элементам объекта, которые содержат символы, недопустимые в соответствии с соглашением об именах PHP (то есть дефис), может быть выполнен путём обрамления имени элемента фигурными скобками и апострофами.

$obj = json_decode ( $json );
print $obj ->< 'foo-bar' >; // 12345

Пример #3 Распространённая ошибка при использовании json_decode()

// Следующие строки являются валидным кодом JavaScript, но не валидными JSON-данными

// Имя и значение должны помещаться в двойные кавычки
// Одинарные кавычки использовать нельзя
$bad_json = «< 'bar': 'baz' >» ;
json_decode ( $bad_json ); // null

// Имя должно обрамляться в двойные кавычки
$bad_json = ‘< bar: "baz" >‘ ;
json_decode ( $bad_json ); // null

// Не должно быть завершающей запятой (без последующего элемента)
$bad_json = ‘< bar: "baz", >‘ ;
json_decode ( $bad_json ); // null

Пример #4 Ошибки с глубиной вложенных объектов ( depth )

// Закодируем данные с глубиной вложенности 4 (array -> array -> array -> string).
$json = json_encode (
array(
1 => array(
‘English’ => array(
‘One’ ,
‘January’
),
‘French’ => array(
‘Une’ ,
‘Janvier’
)
)
)
);

// Напечатаем ошибки для разных глубин.
var_dump ( json_decode ( $json , true , 4 ));
echo ‘Последняя ошибка: ‘ , json_last_error_msg (), PHP_EOL , PHP_EOL ;

var_dump ( json_decode ( $json , true , 3 ));
echo ‘Последняя ошибка: ‘ , json_last_error_msg (), PHP_EOL , PHP_EOL ;
?>

Результат выполнения данного примера:

array(1) < [1]=>array(2) < ["English"]=>array(2) < [0]=>string(3) "One" [1]=> string(7) "January" > ["French"]=> array(2) < [0]=>string(3) "Une" [1]=> string(7) "Janvier" > > > Последняя ошибка: No error NULL Последняя ошибка: Maximum stack depth exceeded

Пример #5 json_decode() с большими целыми числами

var_dump ( json_decode ( $json ));
var_dump ( json_decode ( $json , false , 512 , JSON_BIGINT_AS_STRING ));

Результат выполнения данного примера:

object(stdClass)#1 (1) < ["number"]=>float(1.2345678901235E+19) > object(stdClass)#1 (1) < ["number"]=>string(20) "12345678901234567890" >

Примечания

Замечание:

Спецификация JSON — это не JavaScript, а его подмножество.

Замечание:

В случае возникновения ошибки декодирования можно использовать json_last_error() для определения её причины.

Смотрите также

User Contributed Notes 8 notes

JSON can be decoded to PHP arrays by using the $associative = true option. Be wary that associative arrays in PHP can be a «list» or «object» when converted to/from JSON, depending on the keys (of absence of them).

You would expect that recoding and re-encoding will always yield the same JSON string, but take this example:

$json = »;
$array = json_decode($json, true); // decode as associative hash
print json_encode($array) . PHP_EOL;

This will output a different JSON string than the original:

The object has turned into an array!

Similarly, a array that doesn’t have consecutive zero based numerical indexes, will be encoded to a JSON object instead of a list.

$array = [
‘first’,
‘second’,
‘third’,
];
print json_encode($array) . PHP_EOL;
// remove the second element
unset($array[1]);
print json_encode($array) . PHP_EOL;

The array has turned into an object!

In other words, decoding/encoding to/from PHP arrays is not always symmetrical, or might not always return what you expect!

On the other hand, decoding/encoding from/to stdClass objects (the default) is always symmetrical.

Arrays may be somewhat easier to work with/transform than objects. But especially if you need to decode, and re-encode json, it might be prudent to decode to objects and not arrays.

If you want to enforce an array to encode to a JSON list (all array keys will be discarded), use:

If you want to enforce an array to encode to a JSON object, use:

Источник

PHP json_decode return empty array

I just test this sample from php doc (http://au2.php.net/manual/en/function.json-decode.php) here is my code:

'; echo json_decode($json, true), '
';?>

But it just returns an EMPTY array. Have no idea why. Been searching around but no solution found. PLEASE help!

6 Answers 6

You can validate at following website: http://jsonlint.com/

You have to use a php «json_decode()» function to decode a json encoded data. Basically json_decode() function converts JSON data to a PHP array.

Syntax: json_decode( data, dataTypeBoolean, depth, options )

data : — The json data that you want to decode in PHP.

dataTypeBoolean(Optional) :- boolean that makes the function return a PHP Associative Array if set to «true», or return a PHP stdClass object if you omit this parameter or set it to «false». Both data types can be accessed like an array and use array based PHP loops for parsing.

depth :- Optional recursion limit. Use an integer as the value for this parameter.

options :- Optional JSON_BIGINT_AS_STRING parameter.

Now Comes to your Code

Assign a valid json data to a variable $json_string within single quot’s (») as json string already have double quots.

// here i am decoding a json string by using a php 'json_decode' function, as mentioned above & passing a true parameter to get a PHP associative array otherwise it will bydefault return a PHP std class objecy array. $json_decoded_data = json_decode($json_string, true); // just can check here your encoded array data. // echo '
'; // print_r($json_decoded_data); // loop to extract data from an array foreach ($json_decoded_data as $key => $value) < echo "$key | $value 
"; >

Источник

Оцените статью