
JSON – один из наиболее распространённых форматов для обмена данными между сервером и клиентом. В PHP для работы с JSON используются встроенные функции json_decode() и json_encode(). Основной задачей при извлечении данных является корректная декодировка строки JSON в ассоциативный массив или объект, в зависимости от поставленной задачи.
Чтобы получить данные из JSON, первым шагом нужно убедиться, что строка корректна. Для проверки можно использовать json_last_error() после вызова json_decode(). Это позволит вовремя выявить, например, лишнюю запятую или неверную кодировку символов. При декодировании рекомендуется передавать второй аргумент true, если требуется получить ассоциативный массив вместо объекта:
$data = json_decode($jsonString, true);
При работе с вложенными структурами важно использовать проверку наличия ключей через isset() или array_key_exists(), чтобы избежать ошибок уровня Notice. Если структура глубоко вложена, можно комбинировать доступ с безопасной навигацией, например:
$value = isset($data['user']['profile']['name']) ? $data['user']['profile']['name'] : null;
Если JSON поступает из внешнего источника (например, из файла или по сети), важно перед декодированием применить фильтрацию входных данных, особенно если в массиве присутствуют пользовательские значения. Это помогает защититься от инъекций и других уязвимостей.
Как извлечь данные из JSON в PHP
Для извлечения данных из JSON в PHP используется функция json_decode(). Она преобразует строку JSON в PHP-массив или объект.
Пример базового использования:
$json = '{"name":"Иван","age":30}';
$data = json_decode($json, true);
echo $data['name']; // Иван
Второй аргумент true преобразует JSON в ассоциативный массив. Без него результатом будет объект:
$data = json_decode($json);
echo $data->name; // Иван
Чтобы работать с вложенными структурами, используйте вложенные обращения к ключам:
$json = '{"user":{"name":"Анна","contacts":{"email":"anna@example.com"}}}';
$data = json_decode($json, true);
echo $data['user']['contacts']['email']; // anna@example.com
Проверка на ошибки после декодирования:
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo 'Ошибка JSON: ' . json_last_error_msg();
}
JSON может быть получен из файла:
$json = file_get_contents('data.json');
$data = json_decode($json, true);
Если структура заранее неизвестна, используйте функцию print_r() для изучения содержимого:
print_r($data);
Извлекать данные безопаснее через проверку наличия ключей:
if (isset($data['user']['name'])) {
echo $data['user']['name'];
}
Парсинг JSON строки с помощью функции json_decode()
Функция json_decode() принимает строку в формате JSON и преобразует её в соответствующую структуру PHP: ассоциативный массив или объект. Второй параметр функции определяет формат результата: true – массив, false (по умолчанию) – объект.
Пример парсинга в массив:
$json = '{"name":"Иван","age":30,"languages":["PHP","JavaScript"]}';
$data = json_decode($json, true);
echo $data['name']; // Иван
Пример парсинга в объект:
$json = '{"name":"Иван","age":30,"languages":["PHP","JavaScript"]}';
$data = json_decode($json);
echo $data->name; // Иван
Если строка содержит ошибку, функция вернёт null. Для отладки используйте json_last_error() и json_last_error_msg():
$data = json_decode($json);
if (json_last_error() !== JSON_ERROR_NONE) {
echo 'Ошибка парсинга: ' . json_last_error_msg();
}
Не используйте json_decode() для обработки недоверенных данных без дополнительной валидации. JSON может содержать неожиданные типы, например, null вместо ожидаемой строки.
Для больших вложенных структур предпочтительнее парсить в массив, чтобы избежать ошибок доступа к свойствам объектов.
Работа с ассоциативными массивами после декодирования JSON

Функция json_decode() позволяет сразу преобразовать JSON-строку в ассоциативный массив, если передать true вторым аргументом:
$data = json_decode($jsonString, true);
После этого можно обращаться к значениям по ключам. Это удобно при работе со структурированными данными:
echo $data['user']['name'];
Рекомендуется проверять наличие ключей через array_key_exists() или isset(), чтобы избежать ошибок:
if (isset($data['user']['email'])) {
echo $data['user']['email'];
}
Для перебора ассоциативного массива используется foreach:
foreach ($data['items'] as $key => $value) {
// Обработка $key и $value
}
- Если структура вложенная, используйте рекурсивные функции для обхода.
- Для поиска по значениям применяйте
array_search()илиarray_filter(). - Массив можно модифицировать напрямую: добавлять, изменять или удалять элементы.
При сериализации обратно в JSON используйте json_encode(). Убедитесь, что массив не содержит циклических ссылок.
$newJson = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
Для отладки структуры массива удобно использовать print_r() или var_dump():
print_r($data);
Извлечение данных из многомерного массива

Массив, полученный после декодирования JSON с параметром true в json_decode, часто имеет вложенную структуру. Чтобы получить доступ к нужным данным, необходимо использовать цепочку ключей, соответствующую уровню вложенности.
Пример массива:
$data = [
"user" => [
"id" => 42,
"name" => "Иван",
"contacts" => [
"email" => "ivan@example.com",
"phone" => "123-456"
]
]
];
Для получения номера телефона используйте:
$phone = $data['user']['contacts']['phone'];
Если структура может изменяться или ключи могут отсутствовать, безопаснее применять isset() или оператор null coalescing:
$phone = $data['user']['contacts']['phone'] ?? null;
При работе с массивами внутри списков используйте цикл foreach:
$data = [
"users" => [
["id" => 1, "name" => "Анна"],
["id" => 2, "name" => "Олег"]
]
];
foreach ($data['users'] as $user) {
echo $user['name'];
}
Для поиска по вложенным массивам применяйте фильтрацию:
$result = array_filter($data['users'], function($user) {
return $user['id'] === 2;
});
Для рекурсивного обхода используется array_walk_recursive, если необходимо обработать все значения на всех уровнях:
array_walk_recursive($data, function($value, $key) {
echo "$key: $value\n";
});
Обработка ошибок при декодировании JSON в PHP
Функция json_decode() возвращает null при неудачном декодировании, но это не всегда означает ошибку. Для точной диагностики необходимо использовать json_last_error() и json_last_error_msg().
После вызова json_decode() проверяйте результат:
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('Ошибка JSON: ' . json_last_error_msg());
}
Основные коды ошибок:
- JSON_ERROR_SYNTAX – некорректный JSON, например, пропущена запятая или кавычка;
- JSON_ERROR_DEPTH – превышена максимальная глубина вложенности (по умолчанию 512);
- JSON_ERROR_UTF8 – некорректная UTF-8 строка, часто встречается при неправильной кодировке;
- JSON_ERROR_CTRL_CHAR – неожиданное управляющее значение в строке;
- JSON_ERROR_STATE_MISMATCH – ошибка подстановки или несовместимости режимов.
Указывайте допустимую глубину с третьим аргументом функции json_decode(), если структура может быть глубже стандартной:
$data = json_decode($json, true, 1024);
Если данные поступают извне (например, из API или файла), полезно предварительно валидировать JSON через json_decode() и проверку ошибок, чтобы избежать исключений на последующих этапах обработки.
Для многострочных или больших JSON-строк рекомендуется логгировать json_last_error_msg() с контекстом входных данных – это облегчает отладку при сбоях.
Использование json_decode() с параметром true для получения ассоциативных массивов
Функция json_decode() принимает строку в формате JSON и преобразует её в переменные PHP. Указание второго параметра true позволяет получить не объекты stdClass, а ассоциативные массивы.
- Синтаксис:
json_decode(string $json, bool $associative = false, int $depth = 512, int $flags = 0): mixed - Передача
trueво втором аргументе активирует разбор в массивы.
$json = '{"name": "Иван", "age": 30}';
$data = json_decode($json, true);
echo $data['name']; // Иван
При использовании объектов доступ осуществляется через $data->name, что менее удобно для перебора и интеграции с функциями, ожидающими массивы.
- Проверка на ошибки: после декодирования используйте
json_last_error()для выявления возможных проблем. - Рекурсивные структуры в JSON сохраняются в виде многомерных массивов без дополнительных преобразований.
- Ассоциативные массивы проще сериализовать, фильтровать и преобразовывать с помощью стандартных функций PHP, таких как
array_map(),array_filter()иarray_merge().
Если структура JSON неизвестна заранее, использование параметра true упрощает проверку ключей через array_key_exists() и перебор с foreach.
Как проверить, является ли строка валидным JSON в PHP
Для проверки строки на валидность JSON в PHP используется функция json_decode() в сочетании с json_last_error(). Если после декодирования не возникло ошибок, строка считается корректной.
Пример базовой проверки:
$json = '{"ключ": "значение"}';
json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
echo 'Корректный JSON';
} else {
echo 'Ошибка: ' . json_last_error_msg();
}
json_last_error() возвращает одну из констант ошибки, например JSON_ERROR_SYNTAX или JSON_ERROR_UTF8. Для получения текстового описания ошибки используется json_last_error_msg().
При работе с внешними источниками рекомендуется также проверить, что входные данные – это строка:
if (is_string($json)) {
json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
// Дальнейшая обработка
}
}
Если строка содержит валидный JSON, но не объект или массив (например, число или строка в кавычках), json_decode() всё равно вернёт результат без ошибки. Чтобы это учесть, полезно дополнительно проверять тип результата:
$decoded = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE && (is_array($decoded) || is_object($decoded))) {
// Корректная структура JSON
}
