Avatar ·

Как преобразовать JSON в массив PHP, а не в объект через json_decode()?

Всем привет! Я новичок в PHP и пытаюсь разобраться с JSON. У меня есть JSON-строка, которую я получаю от внешнего API. Я использую функцию `json_decode()`, но она возвращает объект, а мне нужен именно массив. Вот мой код: ```php $json = '{"name":"Иван","age":30,"city":"Москва"}'; $data = json_decode($json); echo $data->name; // Выводит "Иван" — это объект ``` Проблема в том, что мне нужно обращаться к данным как к массиву, например: `$data['name']`. Но когда я так делаю, PHP выдаёт ошибку: "Cannot use object of type stdClass as array". Я пробовал читать документацию, но не до конца понял, как заставить `json_decode()` возвращать массив. Подскажите, пожалуйста, что нужно изменить в коде? Желательно с примером, чтобы я сразу мог применить у себя в проекте. Заранее спасибо! <<>>

Используйте второй параметр json_decode()

Решение вашей проблемы очень простое. Функция json_decode() принимает второй необязательный параметр — булевый флаг $associative. Когда он равен true, функция возвращает ассоциативный массив вместо объекта stdClass.

Вот как это работает:

<?php
$json = '{"name":"Иван","age":30,"city":"Москва"}';

// Передаём true вторым аргументом
$data = json_decode($json, true);

// Теперь это массив!
echo $data['name']; // Выведет "Иван"
echo $data['age'];  // Выведет 30
echo $data['city']; // Выведет "Москва"

// Проверим тип
var_dump($data); // array(3) { ["name"]=> string(8) "Иван" ["age"]=> int(30) ["city"]=> string(12) "Москва" }
?>

Почему это работает?

По умолчанию json_decode() создаёт объекты класса stdClass. Это поведение выбрано для совместимости с JSON-стандартом, где данные представляются как объекты. Однако PHP позволяет легко переключиться на массивы.

Параметр $associative может принимать три значения:

  • false (по умолчанию) — возвращает объекты
  • true — возвращает ассоциативные массивы
  • null — использует настройки по умолчанию (объекты)

Работа со вложенными структурами

Флаг работает рекурсивно для всех уровней вложенности:

<?php
$json = '{
    "user": {
        "name": "Мария",
        "contacts": {
            "email": "maria@example.com",
            "phone": "+7-999-123-45-67"
        }
    }
}';

$data = json_decode($json, true);

// Доступ ко всем уровням как к массивам
echo $data['user']['name'];              // Мария
echo $data['user']['contacts']['email']; // maria@example.com
?>

Важные моменты

  • Всегда проверяйте успешность декодирования через json_last_error()
  • JSON-массивы (в квадратных скобках) всегда преобразуются в обычные индексированные массивы, независимо от флага
  • Если JSON содержит пустой объект {}, при true получите пустой массив, при false — пустой stdClass

Теперь вы можете спокойно работать с данными как с массивами. Удачи в разработке!

<<>>

Альтернативный подход: приведение типов

Если по какой-то причине вы не хотите менять вызов json_decode(), можно преобразовать полученный объект в массив с помощью приведения типов:

<?php
$json = '{"name":"Иван","age":30}';
$object = json_decode($json);
$array = (array) $object;

echo $array['name']; // Иван
?>

Однако этот способ менее надёжен для вложенных структур — дочерние объекты останутся объектами. Для глубокого преобразования пришлось бы писать рекурсивную функцию или использовать json_decode($json, true).

Рекомендация: используйте второй параметр true — это самый простой и эффективный способ, поддерживаемый во всех версиях PHP.