json_decode

(PHP 5 >= 5.2.0, PECL json >= 1.2.0)

json_decodeДекодирует JSON строку

Описание

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

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

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

json

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

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

assoc

Если TRUE, возвращаемые объекты будут преобразованы в ассоциативные массивы.

depth

Указывает глубину рекурсии.

options

Битовая маска опций декодирования JSON. В настоящий момент поддерживается только JSON_BIGINT_AS_STRING (по умолчанию большие целые числа приводятся к числам с плавающей запятой (float))

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

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

Примеры

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

<?php
$json 
'{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($jsontrue));

?>

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

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
// Кодирование данных.
$json json_encode(
    array(
        
=> array(
            
'English' => array(
                
'One',
                
'January'
            
),
            
'French' => array(
                
'Une',
                
'Janvier'
            
)
        )
    )
);

// Создаем массив с ошибками.
$constants get_defined_constants(true);
$json_errors = array();
foreach (
$constants["json"] as $name => $value) {
    if (!
strncmp($name"JSON_ERROR_"11)) {
        
$json_errors[$value] = $name;
    }
}

// Отображаем ошибки для разных глубин рекурсий
foreach (range(43, -1) as $depth) {
    
var_dump(json_decode($jsontrue$depth));
    echo 
'Last error: '$json_errors[json_last_error()], PHP_EOLPHP_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"
    }
  }
}
Last error: JSON_ERROR_NONE

NULL
Last error: JSON_ERROR_DEPTH

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

<?php
$json 
'{"number": 12345678901234567890}';

var_dump(json_decode($json));
var_dump(json_decode($jsonfalse512JSON_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() для определения ее причины.

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

Версия Описание
5.4.0 Был добавлен параметр options.
5.3.0 Добавлен опциональный параметр depth. Глубина рекурсии по умолчанию увеличено с 128 до 512
5.2.3 Глубина рекурсии увеличена с 20 до 128
5.2.1 Добавлена поддержка декодирования основных типов JSON.

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

  • json_encode() - Возвращает JSON-представление данных
  • json_last_error() - Возвращает последнюю ошибку

Коментарии

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.
2020-11-11 15:18:17
http://php5.kiev.ua/manual/ru/function.json-decode.html
Автор:
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_strflagsJSON_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"]}
?>
2021-04-14 12:11:32
http://php5.kiev.ua/manual/ru/function.json-decode.html
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
2022-01-21 19:42:33
http://php5.kiev.ua/manual/ru/function.json-decode.html
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->$keyjson_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();
2023-02-14 17:42:30
http://php5.kiev.ua/manual/ru/function.json-decode.html

    Поддержать сайт на родительском проекте КГБ