PHP Conference China 2020

json_decode

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

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

Описание

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

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

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

json

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

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

Замечание:

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

assoc

Если TRUE, объекты JSON будут возвращены как ассоциативные массивы (array); если FALSE, объекты JSON будут возвращены как объекты (object). Если NULL, объекты JSON будут возвращены как ассоциативные массивы (array) или объекты (object) в зависимости от того, установлена ли JSON_OBJECT_AS_ARRAY в options.

depth

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

options

Битовая маска из констант 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 не может быть преобразован или закодированные данные содержат вложенных уровней больше, чем допустимый предел для рекурсий.

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

Версия Описание
7.3.0 Добавлена константа JSON_THROW_ON_ERROR для параметра options.
7.2.0 assoc теперь nullable.
7.2.0 Добавлены константы JSON_INVALID_UTF8_IGNORE и JSON_INVALID_UTF8_SUBSTITUTE для параметра options.
7.1.0 Пустой ключ JSON ("") будет преобразован в пустое свойство объекта, а не в свойство со значением _empty_.
7.0.0 Отклонен несовместимый с RFC 7159 формат чисел - верхний уровень (07, 0xff, .1, -.1) и все уровни ([1.], [1.e1])
7.0.0 Пустая строка PHP или значение, которое после преобразования к строке становится пустой строкой (NULL, FALSE) приводит к ошибке синтаксиса JSON.
5.6.0 Некорректные варианты написания true, false и null(не в нижнем регистре) более не являются допустимыми значениями и вызовут предупреждение.
5.4.0 Добавлены константы JSON_BIGINT_AS_STRING и JSON_OBJECT_AS_ARRAY для параметра options.
5.4.0 Добавлен параметр options.
5.3.0 Добавлен необязательный параметр depth. Значение глубины рекурсии по умолчанию изменено с 128 на 512
5.2.3 Предел вложенности изменен с 20 на 128
5.2.1 Добавлена поддержка декодирования базовых типов.

Примеры

Пример #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 
'Последняя ошибка: '$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"
    }
  }
}
Последняя ошибка: JSON_ERROR_NONE

NULL
Последняя ошибка: 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() для определения ее причины.

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

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

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top