json_decode

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

json_decode β€” Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ строку JSON

ОписаниС

function json_decode(
Β Β Β Β string $json,
Β Β Β Β ?bool $associative = null,
Β Β Β Β int $depth = 512,
Β Β Β Β int $flags = 0
): mixed

ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π² 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_encode() - Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ JSON-прСдставлСниС Π΄Π°Π½Π½Ρ‹Ρ…
  • json_last_error() - Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ послСднСй ошибки
  • json_last_error_msg() - Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку с сообщСниСм ΠΎΠ± ошибкС послСднСго Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ json_validate(), json_encode() ΠΈΠ»ΠΈ json_decode()
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 6 notes

up
27
Lennart Hengstmengel ΒΆ
4 years ago
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
up
4
cubefox at web dot NOSPAMPLEASE dot de ΒΆ
5 years ago
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.
up
1
greaties at ghvernuft dot nl ΒΆ
3 years ago
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();
up
-1
jdpsaratoga at gmail dot com ΒΆ
3 months ago
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.
up
-1
Alien426 ΒΆ
5 years ago
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"]}
?>
up
-4
Anonymous ΒΆ
1 year ago
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);
?>