Ошибка «Cannot use object of stdClass as array» при работе с JSON в PHP
Причина ошибки: объект stdClass вместо массива
Ошибка возникает из-за того, что функция json_decode() по умолчанию возвращает объект класса stdClass, а не массив. В PHP объекты и массивы — это разные типы данных, и к ним применяются разные синтаксисы доступа:
- К массивам обращаются через квадратные скобки:
$array['key'] - К объектам обращаются через стрелку:
$object->property
Когда вы пишете $data['name'], PHP пытается использовать объект как массив, что и вызывает ошибку.
Решение 1: Использовать синтаксис объекта
Самый простой способ — обращаться к свойствам через стрелку (->):
<?php
$json = '{"name": "Иван", "age": 30, "city": "Москва"}';
$data = json_decode($json);
// Правильный способ для объекта
echo $data->name; // Выведет: Иван
echo $data->age; // Выведет: 30
echo $data->city; // Выведет: Москва
?>
Решение 2: Преобразовать JSON в ассоциативный массив
Если вам удобнее работать с массивами, передайте второй параметр true в json_decode():
<?php
$json = '{"name": "Иван", "age": 30, "city": "Москва"}';
$data = json_decode($json, true); // true = ассоциативный массив
// Теперь можно использовать квадратные скобки
echo $data['name']; // Выведет: Иван
echo $data['age']; // Выведет: 30
echo $data['city']; // Выведет: Москва
?>
Решение 3: Работа с вложенными структурами
В реальных API часто встречаются сложные вложенные данные. Рассмотрим пример с вложенным JSON:
<?php
$json = '{
"user": {
"name": "Мария",
"contacts": {
"email": "maria@example.com",
"phone": "+7-999-123-45-67"
}
},
"orders": [100, 200, 300]
}';
// Как объект
$dataObj = json_decode($json);
echo $dataObj->user->name; // Мария
echo $dataObj->user->contacts->email; // maria@example.com
echo $dataObj->orders[0]; // 100 (массив внутри объекта)
// Как ассоциативный массив
$dataArr = json_decode($json, true);
echo $dataArr['user']['name']; // Мария
echo $dataArr['user']['contacts']['email']; // maria@example.com
echo $dataArr['orders'][0]; // 100
?>
Проверка на ошибки
Всегда проверяйте успешность декодирования:
<?php
$json = '{"name": "Иван", "age": 30}';
$data = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
// JSON корректен
echo $data->name;
} else {
echo 'Ошибка JSON: ' . json_last_error_msg();
}
?>
Совет для начинающих
Используйте var_dump() или print_r(), чтобы посмотреть структуру данных:
<?php
$data = json_decode($json);
var_dump($data); // Покажет, что это object(stdClass)
?>
Это поможет быстро понять, с каким типом данных вы работаете.
<<Альтернативный подход: явное приведение типов
Иногда бывает удобно преобразовать объект в массив «на лету» с помощью приведения типа (array). Это может пригодиться, если вы не контролируете исходный код, который возвращает объект.
<?php
$json = '{"name": "Иван", "age": 30}';
$data = json_decode($json);
// Преобразуем объект в массив
$dataArray = (array) $data;
echo $dataArray['name']; // Иван
echo $dataArray['age']; // 30
?>
Важно: Этот способ работает только для плоских структур. Если у вас вложенные объекты, они останутся объектами — приведение не рекурсивно. Для глубоко вложенных данных лучше сразу использовать второй параметр json_decode($json, true).
Дополнительный совет: работа с API
При работе с внешними API часто возвращается JSON с вложенными объектами. Например, ответ от сервиса погоды:
<?php
$response = file_get_contents('https://api.example.com/weather');
$weather = json_decode($response, true); // Сразу как массив
echo "Температура: " . $weather['main']['temp'] . "°C";
echo "Город: " . $weather['name'];
?>
Использование ассоциативных массивов часто упрощает чтение и обработку таких данных, особенно если вы привыкли к синтаксису других языков (Python, JavaScript).