
JSON – популярный формат обмена данными между клиентом и сервером. В PHP его разбор осуществляется встроенной функцией json_decode(), которая преобразует строку в формате JSON в ассоциативный массив или объект. Преимущество этого подхода – высокая скорость обработки и минимальное количество зависимостей.
Перед разбором JSON необходимо убедиться, что строка валидна. Это можно сделать с помощью json_last_error() после вызова json_decode(). Если функция возвращает JSON_ERROR_NONE, данные успешно разобраны. В противном случае нужно отловить ошибку и обработать её, например, при помощи конструкции switch-case по коду ошибки.
По умолчанию json_decode() возвращает объект stdClass. Чтобы получить ассоциативный массив, необходимо передать вторым аргументом значение true: json_decode($jsonString, true). Это особенно удобно, если данные поступают из API и должны быть использованы в логике обработки массива.
Важно учитывать нюансы кодировки. Если строка в кодировке, отличной от UTF-8, json_decode() может вернуть null. В таком случае следует выполнить преобразование при помощи mb_convert_encoding() или iconv() перед разбором данных.
Распарсенные данные часто включают вложенные структуры. Для безопасной навигации по таким массивам следует использовать проверку на наличие ключей с помощью isset() или array_key_exists(), особенно если структура может меняться в зависимости от источника.
Как получить JSON-строку из внешнего источника в PHP
Для получения JSON-строки из внешнего API используйте функцию file_get_contents(), если источник доступен по HTTP и не требует авторизации. Пример:
$json = file_get_contents('https://api.example.com/data');
Если сервер требует заголовки или аутентификацию, используйте cURL. Пример запроса с использованием токена авторизации:
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer YOUR_TOKEN_HERE',
'Accept: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
После получения строки проверьте результат. Если $response === false, вызовите curl_error($ch) для отладки. Убедитесь, что сервер возвращает корректный JSON, иначе json_decode() не сможет его обработать.
Для запросов с параметрами предпочтительно использовать http_build_query() и метод POST с передачей данных через CURLOPT_POSTFIELDS. Это особенно важно при взаимодействии с REST API.
Всегда проверяйте код ответа HTTP с помощью curl_getinfo($ch, CURLINFO_HTTP_CODE), чтобы убедиться в успешности запроса (код 200).
Как проверить валидность JSON перед разбором
Перед вызовом json_decode() важно удостовериться, что строка действительно содержит корректный JSON. Это предотвратит ошибки при разборе и возможные уязвимости.
В PHP нет отдельной функции только для валидации JSON, но можно использовать json_decode() в паре с json_last_error(). Сначала вызывается json_decode(), затем проверяется код последней ошибки:
$json = '{"name": "Иван", "age": 30}';
$data = json_decode($json);
if (json_last_error() !== JSON_ERROR_NONE) {
echo 'Ошибка в JSON: ' . json_last_error_msg();
} else {
// JSON валиден, можно продолжать
}
Функция json_last_error() возвращает одно из предопределённых значений, таких как JSON_ERROR_SYNTAX или JSON_ERROR_UTF8. Для получения текстового описания ошибки используется json_last_error_msg().
Также полезно установить флаг JSON_THROW_ON_ERROR во втором аргументе json_decode(), чтобы сразу получить исключение при некорректных данных:
try {
$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'Невалидный JSON: ' . $e->getMessage();
}
Этот подход более надёжен, особенно при работе с внешними источниками. Он позволяет централизованно обрабатывать ошибки и избегать немых сбоев.
Как использовать функцию json_decode для преобразования JSON

Функция json_decode принимает JSON-строку и преобразует её в переменную PHP. Она возвращает объект или массив, в зависимости от переданных параметров.
- Первый параметр – строка в формате JSON.
- Второй параметр (необязательный) – логическое значение
trueдля возврата ассоциативного массива вместо объекта. - Третий – максимальная глубина вложенности (по умолчанию 512).
- Четвёртый – флаги для управления поведением парсера (например,
JSON_THROW_ON_ERROR).
Пример: преобразование JSON в массив:
$json = '{"name":"Иван","age":30}';
$data = json_decode($json, true);
echo $data['name']; // Иван
Если требуется объект, второй параметр можно опустить:
$data = json_decode($json);
echo $data->name; // Иван
Для обработки ошибок используйте флаг JSON_THROW_ON_ERROR начиная с PHP 7.3:
try {
$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'Ошибка декодирования: ' . $e->getMessage();
}
Никогда не обрабатывайте результат json_decode без проверки. Если строка некорректна, функция вернёт null, что может привести к логическим ошибкам в коде.
- Проверяйте результат с помощью
json_last_error()при использовании без флагов. - Используйте строго типизированный подход при работе с API.
- Не передавайте пользовательский ввод напрямую – предварительно валидируйте его.
Чем отличаются ассоциативные массивы от объектов при разборе JSON
В PHP функция json_decode() по умолчанию преобразует JSON-объекты в объекты класса stdClass. Чтобы получить ассоциативный массив, необходимо передать вторым аргументом true:
$json = '{"name":"Иван","age":30}';
$obj = json_decode($json);
// $obj->name → "Иван"
$arr = json_decode($json, true);
// $arr['name'] → "Иван"
Ассоциативные массивы удобны для быстрой выборки значений и использования в условиях или циклах, особенно если структура заранее известна:
if ($arr['age'] > 18) {
echo 'Совершеннолетний';
}
Объекты stdClass более уместны, если данные нужно передавать между методами как единый логически связанный блок или если планируется доступ к свойствам через объектную нотацию:
function printUser($user) {
echo $user->name . ', ' . $user->age;
}
Если структура вложенная, массивы позволяют легче обходить уровни:
foreach ($arr['users'] as $user) {
echo $user['name'];
}
С объектами требуется дополнительная проверка типов и преобразования при доступе к вложенным элементам:
foreach ($obj->users as $user) {
echo $user->name;
}
Обратите внимание: массивы легче сериализуются обратно в JSON, особенно если структура может быть частично изменена. Объекты же теряют типы, и при повторном json_encode() могут вести себя иначе, особенно если были кастомные свойства или методы.
Для гарантированной совместимости при работе с API рекомендуется использовать массивы, если не требуется объектная модель. Для строгой структуры данных с валидацией – объекты с определёнными классами.
Как обрабатывать ошибки при разборе JSON с помощью json_last_error

После вызова json_decode() результат следует проверять не только на null, но и использовать json_last_error() для точной диагностики. Эта функция возвращает код последней ошибки разбора.
Для интерпретации кода ошибки применяйте json_last_error_msg(), возвращающую человекочитаемое сообщение. Пример:
$data = json_decode($json);
if (json_last_error() !== JSON_ERROR_NONE) {
die('Ошибка JSON: ' . json_last_error_msg());
}
Наиболее распространённые ошибки: JSON_ERROR_SYNTAX (синтаксическая ошибка), JSON_ERROR_DEPTH (превышена максимальная глубина вложенности), JSON_ERROR_UTF8 (невалидная UTF-8 строка). Чтобы корректно обрабатывать JSON_ERROR_UTF8, перед декодированием можно очистить строку:
$json = mb_convert_encoding($json, 'UTF-8', 'UTF-8');
В продакшене важно логировать неудачные попытки с указанием источника JSON, кода и текста ошибки. Это упрощает отладку и помогает быстро выявлять проблемы в потоке данных.
Никогда не полагайтесь только на возвращаемое значение null: оно может быть результатом корректного декодирования значения null, а не ошибкой. Всегда используйте json_last_error() для верификации.
Как работать с вложенными структурами JSON в PHP

Для разбора вложенных структур JSON в PHP необходимо использовать ассоциативные массивы или объекты. При декодировании JSON с помощью json_decode() указывайте второй аргумент true, чтобы получить массив: json_decode($json, true).
Рассмотрим пример. Исходный JSON:
{
"user": {
"id": 42,
"profile": {
"name": "Иван",
"contacts": {
"email": "ivan@example.com",
"phone": "+71234567890"
}
}
}
}
После декодирования:
$data = json_decode($json, true);
Доступ к вложенным элементам осуществляется пошагово:
$email = $data['user']['profile']['contacts']['email'];
$phone = $data['user']['profile']['contacts']['phone'];
Проверяйте существование ключей через isset() перед обращением, чтобы избежать ошибок:
if (isset($data['user']['profile']['contacts']['email'])) {
$email = $data['user']['profile']['contacts']['email'];
}
Для сложных и глубоко вложенных структур удобно использовать рекурсивные функции. Пример поиска всех значений по ключу:
function findByKey(array $array, string $key): array {
$results = [];
foreach ($array as $k => $v) {
if ($k === $key) {
$results[] = $v;
}
if (is_array($v)) {
$results = array_merge($results, findByKey($v, $key));
}
}
return $results;
}
$emails = findByKey($data, 'email');
Если json_decode() используется без второго аргумента, результат – объект stdClass. Доступ к полям в этом случае осуществляется через оператор ->:
$data = json_decode($json);
$email = $data->user->profile->contacts->email;
Для работы с переменной структурой JSON используйте is_object() и is_array() для анализа типа значения в каждом узле.
