(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL json >= 1.2.0)
json_decode — Декодирует строку JSON
$json,$associative = null ,$depth = 512,$flags = 0Принимает закодированную в JSON строку и преобразовывает её в PHP-значение.
json
Строка (string ) json для декодирования.
Функция работает только со строками в кодировке UTF-8.
Замечание: PHP реализует расширенный набор JSON, который описывает исходный стандарт » RFC 7159.
associative
Если true , объекты JSON будут возвращены как
ассоциативные массивы (array ); если false , объекты JSON будут возвращены как объекты (object ).
Если null , объекты JSON будут возвращены как ассоциативные массивы (array ) или
объекты (object ) в зависимости от того, установлена ли JSON_OBJECT_AS_ARRAY
в flags.
depth
Максимальная глубина вложенности структуры, для которой будет производиться декодирование.
Значение должно быть больше 0 и меньше или равно 2147483647.
flags
Битовая маска из констант
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()
<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
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 (то есть дефис), может быть выполнен путём обрамления имени элемента фигурными скобками и апострофами.
<?php
$json = '{"foo-bar": 12345}';
$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345
?>Пример #3 Распространённая ошибка при использовании json_decode()
<?php
// Следующие строки являются валидным кодом 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)
<?php
// Закодируем данные с глубиной вложенности 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() с большими целыми числами
<?php
$json = '{"number": 12345678901234567890}';
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() для определения её причины.
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 = '{"0": "No", "1": "Yes"}';
$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:
["No","Yes"]
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 output will be:
["first","second","third"]
{"0":"first","2":"third"}
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:
json_encode(array_values($array));
If you want to enforce an array to encode to a JSON object, use:
json_encode((object)$array);
See also: https://www.php.net/manual/en/function.array-is-list.php Warning: As the section "return values" mentions, the return value NULL is ambiguos. To repeat, it can mean three things:
* The input string had the value "null"
* There was an error while parsing the input data
* The encoded data was deeper than the recursion limit
To distinguish these cases, json_last_error() can be used.To load an object with data in json format:
(bugfixed my previous comment)
<?php
function loadJSON($Obj, $json)
{
$dcod = json_decode($json);
$prop = get_object_vars ( $dcod );
foreach($prop as $key => $lock)
{
if(property_exists ( $Obj , $key ))
{
if(is_object($dcod->$key))
{
loadJSON($Obj->$key, json_encode($dcod->$key));
}
else
{
$Obj->$key = $dcod->$key;
}
}
}
return $Obj;
}
?>
Tested with:
<?php
class Name
{
public $first;
public $last;
public function fullname()
{
return $this->first . " " . $this->last;
}
}
$json = '{"first":"John","last":"Smith"}';
$infull = loadJSON((new Name), $json);
echo $infull->fullname();If you json_encode() an associative array it is encoded as an object, not an array. For example
echo json_encode( ["a"=>42, "b"=>99] );
will result in: {"a":42,"b":99} which is the JSON representation of an object, not an array. The encode has lost the information that this was an array originally.
So this means if you decode the above it will refuse to accept it as an argument for any array functions.
You can cast it to an array or set the second parameter in the decode, but that assumes you were the one that encoded it and knew it was supposed to be an array.Browsers don't choke on integers _starting_ with BigInt (64 bits), but before that (53 bits). The introduction of BigInt to modern browsers doesn't help much, when JSON handling functions do not support it. So I am trying to remedy that. My approach is to handle the decoded array before re-encoding it to a string:
<?php
function fix_large_int(&$value)
{
if (is_int($value) && $value > 9007199254740991)
$value = strval($value);
}
$json_str = '{"id":[1234567890123456789,12345678901234567890]}';
$json_arr = json_decode($json_str, flags: JSON_BIGINT_AS_STRING | JSON_OBJECT_AS_ARRAY);
echo(json_encode($json_arr)); // {"id":[1234567890123456789,"12345678901234567890"]} (BigInt is already converted to a string here)
array_walk_recursive($json_arr, 'fix_large_int');
echo(json_encode($json_arr)); // {"id":["1234567890123456789","12345678901234567890"]}
?>When JSON_OBJECT_AS_ARRAY is true, "json_decode($json)" is the same as "json_decode($json, false)" and return object actually.
<?php
$php_constants = (get_defined_constants(true));
printf($php_constants['json']['JSON_OBJECT_AS_ARRAY'] . PHP_EOL);
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
$data = json_decode($json);
printf(is_array($data) . PHP_EOL);//false
var_dump($data);
$data = json_decode($json, false);
printf(is_array($data) . PHP_EOL);//false
var_dump($data);
$data = json_decode($json, true);
printf(is_array($data) . PHP_EOL);//true
var_dump($data);
?>