Сериализуем объект в Json

Все мы знаем, что в PHP для этого есть функция json_encode

class Car
{
    public function __construct()
    {
        $this->name = 'Audi';
    }
}

echo json_encode(new Car);

Т.к. у нас простой объект, то json_encode сработает правильно и мы получим:

{"name":"Audi"}

Но, что нам делать, когда у нас сложный объект - объект включающий в себя другие объекты.

Для этого, PHP предлагает нам интерфейс JsonSerializable имеющий функцию jsonSerialize, которая будет вызываться функцией json_encode:

class Car implements \JsonSerializable
{
    public function __construct()
    {
        $this->name = 'Audi';
        $this->wheels = new Wheels($this);
    }

    /**
     * @return array
     */
    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}

class Wheels implements \JsonSerializable
{
    public function __construct($car)
    {
        $this->car = $car;
        $this->count = 4;
    }

    /**
     * @return array
     */
    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}

var_dump(json_encode(new Car));

однако, в текущей ситуации мы получим:

bool(false)

дело в том, что наш объект имеет рекурсивную ссылку., но json_encode не умеет правильно обрабатывать глубину таких ссылок.

Поэтому, правильным решением будет - добавление проверки на рекурсию в классе Wheels:

    public function jsonSerialize()
    {
        $array = [];
        foreach($this as $k => $v){
            if(is_scalar($v)){
                $array[$k] = $v;
            }
        }
        return $array;
    }

Таким образом мы получим результат:

{"name":"Audi","wheels":{"count":4}}

Удачки, господа.

Оцени публикацию:
  • 0,0
Оценили человек: 0

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

Новые заметки:

Про что мы забываем когда делаем оценку задачи по времени

Список вопросов для собеседования разработчика по телефону

Symfony2 авторизация без Doctrine2 для чайника

Phpstorm7 LiveEdit

Жесткий хабр или не хабр, тогда кто?

Яндекс.Деньги мошенничество

Как узнать какие страницы в поиске яндекса или это секрет

Последние комменты:

Yapro CMS:

Здравствуйте, Гость | Войти | Регистрация | Карта сайта | RSS ленты | Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2018 YaPro.Ru

Главная » Веб-мастеру » PHP »