#json #symfony #serialization
#json #symfony #сериализация
Вопрос:
Я использую https://jmsyst.com/libs/serializer автономно, а не с Symfony. У меня есть два класса сущностей следующим образом, где SomeProperty
является подобъектом для MyEntity
:
class MyEntity {
private $id, $name, $some_property;
public function getId() {return $this->id;}
public function getName(){return $this->name;}
public function getSomeProperty(){return $this->some_property;}
}
class SomeProperty {
private some_sub_property;
public function getSomeSubProperty(){return $this->some_sub_property;}
}
Я могу успешно выполнить сериализацию объекта по умолчанию, которая приводит к следующему JSON:
{
"id":123,
"name":"foo",
"some_property" : {
"some_sub_property: "bar"
}
}
Но вместо этого я хочу включить свойство в SomeProperty
подобъект на том же уровне, что и другие свойства в MyEntity
, такие как:
{
"id":123,
"name":"foo",
"mySubproperty": "bar"
}
Я перепробовал около сотни вариантов XML для определения сериализации, и все они чем-то похожи на приведенные ниже, однако они приводят к включению id
и name
, но не mySubproperty
.
<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
<class name="NSAppDomainEntityMyEntity">
<xml-namespace prefix="atom" uri="http://www.w3.org/2005/Atom"/>
<property name="id"/>
<property name="name"/>
<virtual-property
method="getSomeProperty"
access-type="public_method"
accessor-getter="getSomeSubProperty"
serialized-name="mySubproperty"
/>
</class>
</serializer>
Как это достигается? Спасибо
Ответ №1:
Используйте @VirtualProperty
аннотацию, если это не поле, которое вы используете в другом месте. Если вы используете его, добавьте @Exclude
on getSomeProperty()
и виртуальное свойство с другим именем.
/**
* @SerializerVirtualProperty()
*/
public function getSomeProperty()
{
return $this->getSomeSubProperty();
}
Комментарии:
1. Спасибо за ошибки. Безуспешно пытался заставить это работать в течение нескольких часов. Я добавил еще немного контента к своему исходному сообщению. Не могли бы вы взглянуть?
2. Не уверен, зачем вам использовать xml с ручной настройкой… Это сложная задача для чтения и отладки. Однако ваш класс уже должен включать виртуальное свойство в коде, MyEntity должен иметь
getSomeSubProperty()
средство получения, которое возвращает вложенное свойство. Ваш xml определяет вывод, но не логику, которая выполняется php.3. Спасибо за ошибки. Теперь я понял. Документация XML немного сложна и вводит в заблуждение.
4. Только что попробовал использовать VirtualProperty, и это отлично работает. Также пробовал использовать
@Accessor(getter="getSomeProperty")
, и это также отлично работает. Почему бы просто не использоватьAssessor
, поскольку тогда это можно было бы использовать и для десериализации?