php json_encode() Объект не конвертируется в json - получаю пустой объект, но работает если конвертировать в массив
Primary tabs
Почему при отправке объекта в формате json, получаю пустой объект?
Если явно сменить тип переменной на array, данные передаются корректно:
foreach ($allMessages as $message) {
$loadingMessages[] = (array) $message;
}
return new JsonResponse([
'loadingMessages' => $loadingMessages,
]);Решение
Проблема в том, что private свойства объекта не упаковываются в json.
Здесь предлагают сериализовать объекты с помощью подключения интрефейса:
class Message implements JsonSerializable {
...
}и переопределяем метод:
class Message implements JsonSerializable
{
...
public function jsonSerialize()
{
return get_object_vars($this);
}
}Всё, теперь private свойства можно передавать обычным способом:
return json_encode($loadingMessages);
- Log in to post comments
- 20104 reads
vedro-compota
Fri, 11/10/2017 - 12:26
Permalink
замечания и уточннения
1)
правильно говорить "в формате json"
2)
А разве объект в объект в php вообще приводится стандартным вызовом в json?
Что под капотом у JsonResponse (наверняка что-то типа (в конечном итоге):
-- а если так, то гляньте, работает ли эта функция с объектами в принципе)?
_____________
матфак вгу и остальная классика =)
melisa
Fri, 11/10/2017 - 12:43
Permalink
уточнения
1) исправлено
2)
vedro-compota
Fri, 11/10/2017 - 12:29
Permalink
скорее эту заметку надо
скорее эту заметку надо отправить в симфони -- или что за объекты вы используете. Это не чистая php-проблема/заметка)
_____________
матфак вгу и остальная классика =)
melisa
Fri, 11/10/2017 - 12:47
Permalink
JsonResponse в данном случае
JsonResponse в данном случае не играет роли, отправлять пробовала и обычным способом, суть не меняется:
foreach ($allMessages as $message) { $loadingMessages[] = $message; } return json_encode($loadingMessages);vedro-compota
Fri, 11/10/2017 - 12:55
Permalink
пробовала и обычным способом,
создайте произвольный простой объект (своего класса ) и отправьте его через json_encode()
-- а чем отвечает сервер? undefined это же просто JS значение, его вообще некорректно упоминать в замечании, если ничего не приходит, то надо говорить о пустой строке.
-- может вы просто не ту переменную распечатываете? посмотрите на ответ во вкладке "сеть".
_____________
матфак вгу и остальная классика =)
melisa
Fri, 11/10/2017 - 13:04
Permalink
получаю пустой объект
получаю пустой объект.
Undefined, соответственно, при обращении к свойству объекта
vedro-compota
Fri, 11/10/2017 - 13:09
Permalink
Скиньте определение класса
Скиньте определение класса объекта (как он описан в php)
_____________
матфак вгу и остальная классика =)
melisa
Fri, 11/10/2017 - 13:34
Permalink
класс Message, кстати, содержит в полях другие объекты
<?php namespace IFF\ChatBundle\Entity; use AppBundle\Entity\User; use Doctrine\ORM\Mapping as ORM; use DateTime; /** * @ORM\Table(name="message") * @ORM\Entity */ class Message { /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="SEQUENCE") * @ORM\SequenceGenerator(sequenceName="message_id_seq", allocationSize=1, initialValue=1) */ private $id; /** * @var string * * @ORM\Column(name="content", type="text") */ private $content; /** * @var DateTime * * @ORM\Column(name="date", type="datetime") */ private $timestamp; /** * @var User * * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User") * @ORM\JoinColumn(name="user_from", referencedColumnName="id") */ private $userFrom; /** * @var User * * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User") * @ORM\JoinColumn(name="user_to", referencedColumnName="id") */ private $userTo; /** * @return int */ public function getId(): int { return $this->id; } /** * @return string */ public function getContent(): string { return $this->content; } /** * @param string $content * * @return self */ public function setContent(string $content): self { $this->content = $content; return $this; } /** * @return DateTime */ public function getTimestamp(): DateTime { return $this->timestamp; } /** * @param DateTime $timestamp * * @return self */ public function setTimestamp(DateTime $timestamp): self { $this->timestamp = $timestamp; return $this; } /** * Узнать, какой пользователь написал сообщение * * @return User */ public function getUserFrom(): User { return $this->userFrom; } /** * Установить связь с таблицей пользователей * * @param User $userFrom * * @return self */ public function setUserFrom(User $userFrom): self { $this->userFrom = $userFrom; return $this; } /** * Узнать, какому пользователю написано сообщение * * @return User */ public function getUserTo(): User { return $this->userTo; } /** * Установить связь с таблицей пользователей * * @param User $userTo * * @return self */ public function setUserTo(User $userTo): self { $this->userTo = $userTo; return $this; } }vedro-compota
Fri, 11/10/2017 - 13:38
Permalink
угу. приватные члены класса
угу. приватные члены класса не серриализуются. в этом-то и проблема.
Можно так:
public function getJSONEncode() { return json_encode(get_object_vars($this)); }_____________
матфак вгу и остальная классика =)
vedro-compota
Fri, 11/10/2017 - 13:01
Permalink
а если так, то гляньте,
посмотрел, да должна работать.
_____________
матфак вгу и остальная классика =)