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
Автор:
if you're using ajax to post, and your JavaScript code looks like this:

<code>
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST", "something.php", true); 
    xhttp.setRequestHeader("Content-Type", "application/json");
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) { 
             // do something
        }
    };
    var data = {some: "thing"};
    xhttp.send(JSON.stringify(data));
</code>

then in <code>something.php</code> you can retrieve your json by doing

<?php
$data 
json_decode(file_get_contents("php://input"), true);
?>
2021-02-06 22:51:23
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
To load an object with data in json format:

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;
            }
        }
    }
}
2021-04-28 14:36:00
http://php5.kiev.ua/manual/ru/function.json-decode.html
Автор:
<?php

$array 
= [=> "foo"=> "bar"=> ["baz"]];

$associative false;

var_dump(
   
json_decode(
       
json_encode($array),
       
$associative
   
)
);

?>

The above will output
<?php
/*
array (size=3)
  0 => string 'foo' (length=3)
  1 => string 'bar' (length=3)
  2 =>
    array (size=1)
      0 => string 'baz' (length=3)
*/
?>

Considering <?php $associative false?> one might expect
<?php
/*
object(stdClass)
  public '0' => string 'foo' (length=3)
  public '1' => string 'bar' (length=3)
  public '2' =>
    object(stdClass)
      public '0' => string 'baz' (length=3)
*/
?>

an stdClass object instead of an array, but this is incorrect.
json_decode will always return an array for a sequentially encoded array, regardless of the ?bool $associative 2nd argument

Which is inline with the above mentioned docs/spec
    > Returns the value encoded in json in appropriate PHP type

Considering that the 1st arg was a sequentially encoded array as a json string
    '["foo","bar",["baz"]]'
2021-09-25 05:44:52
http://php5.kiev.ua/manual/ru/function.json-decode.html
On some PHP7+ systems php_json functions can be undefined (i faced it on Oracle Linux Enterprice with php 7.4 installed from REMI repository). If you have the same problem, try to install separated php-json module:

# yum install php-json

Hope this helps.
2021-11-08 15:49:09
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

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