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
- 18974 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 в данном случае не играет роли, отправлять пробовала и обычным способом, суть не меняется:
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, кстати, содержит в полях другие объекты
vedro-compota
Fri, 11/10/2017 - 13:38
Permalink
угу. приватные члены класса
угу. приватные члены класса не серриализуются. в этом-то и проблема.
Можно так:
_____________
матфак вгу и остальная классика =)
vedro-compota
Fri, 11/10/2017 - 13:01
Permalink
а если так, то гляньте,
посмотрел, да должна работать.
_____________
матфак вгу и остальная классика =)