Все мы знаем, что в 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 Wheels(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}}
Удачки, господа.
Комментарии
Комментариев пока нет.