Работа с JSON в PHP
JSON (JavaScript Object Notation) - текстовый формат обмена данными, основанный на JavaScript. При этом формат независим от JS и может использоваться в любом языке программирования. Формат представляет собой набор данных в виде {ключ: значение}. Значение может быть массивом, числом, строкой или булевым значением.
В вебе json в основном используется при ajax-запросах и взаимодействии с различными API.
Кодирование в JSON
Для кодирования массива данных или объекта в PHP используется функция json_encode.
json_encode(mixed $value, int $flags = 0, int $depth = 512) - возвращает JSON-представление данных
Функция имеет один обязательный параметр: value - значение (массив или объект), которое будет закодировано. С помощью параметра flags можно задавать различные параметры влияющие на кодирование.
Пример:
$arr = array('a' => 'эй', 'b' => 'би', 'c' => 'си', 'd' => 'ди');
echo json_encode($arr);
Результат:
{"a":"\u044d\u0439","b":"\u0431\u0438","c":"\u0441\u0438","d":"\u0434\u0438"}
Из результата видно, что кириллица кодируется. Чтобы исправить необходимо добавить опцию JSON_UNESCAPED_UNICODE:
$arr = array('a' => 'эй', 'b' => 'би', 'c' => 'си', 'd' => 'ди');
echo json_encode($arr, JSON_UNESCAPED_UNICODE);
Результат:
{"a":"эй","b":"би","c":"си","d":"ди"}
Декодирование
Функция json_decode($json) преобразует строку в объект.
json_decode(string $json, ?bool $associative = null, int $depth = 512, int $flags = 0) - принимает закодированную в JSON строку и преобразует её в PHP-значение.
Функция имеет один обязательный параметр: json - строка для декодирования. associative - если true, объекты JSON будут возвращены как ассоциативные массивы (array), если false, объекты JSON будут возвращены как объекты (object)
$json = '{"a":"эй","b":"би","c":"си","d":"ди"}';
$result = json_decode($json);
print_r($result);
Результат:
stdClass Object
(
[a] => эй
[b] => би
[c] => си
[d] => ди
)
Если вторым аргументом добавить true, то в результате получим массив:
$json = '{"a":"эй","b":"би","c":"си","d":"ди"}';
$result = json_decode($json, true);
print_r($result);
Результат:
Array
(
[a] => эй
[b] => би
[c] => си
[d] => ди
)
Получение ошибок
В случае ошибки, функция json_decode возвращает NULL. Ошибки возникают если json не может быть преобразован. Посмотреть ошибку можно с помощью функции json_last_error.
json_last_error() - возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON.
Пример:
$json = '{"a:"эй"}';
$array = json_decode($json);
switch (json_last_error()) {
case JSON_ERROR_NONE:
echo 'Ошибок нет';
break;
case JSON_ERROR_DEPTH:
echo 'Достигнута максимальная глубина стека';
break;
case JSON_ERROR_STATE_MISMATCH:
echo 'Неверный или некорректный JSON';
break;
case JSON_ERROR_CTRL_CHAR:
echo 'Ошибка управляющего символа, возможно неверная кодировка';
break;
case JSON_ERROR_SYNTAX:
echo 'Синтаксическая ошибка';
break;
case JSON_ERROR_UTF8:
echo 'Некорректные символы UTF-8, возможно неверная кодировка';
break;
case JSON_ERROR_RECURSION:
echo 'Одна или несколько зацикленных ссылок в кодируемом значении';
break;
case JSON_ERROR_INF_OR_NAN:
echo 'Одно или несколько значений NAN или INF в кодируемом значении';
break;
case JSON_ERROR_UNSUPPORTED_TYPE:
echo 'Передано значение с неподдерживаемым типом';
break;
case JSON_ERROR_INVALID_PROPERTY_NAME:
echo 'Имя свойства не может быть закодировано';
break;
case JSON_ERROR_UTF8:
echo 'Некорректный символ UTF-16, возможно некорректно закодирован';
break;
default:
echo 'Неизвестная ошибка';
break;
}