Сериализуем объект в 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

youtube.com/watch?v=7hFivbgIEqk

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

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