Использование библиотеки сериализатора Symfony для использования значения в подобъекте

#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 , поскольку тогда это можно было бы использовать и для десериализации?