动态JMS序列化程序类型

问题描述 投票:1回答:2

是否可以在同一属性上有一个类,有2种类型(1个用于序列化,1个用于反序列化)?

例如,我使用的API允许我将地址作为字符串发送,并且我收到与对象相同的地址。像这样:

请求:

{
  "address": "12 rue rivoli, 75001 Paris"
}

响应

{
  "address": {
    "street": "12 Rue de Rivoli",
    "postcode": "75004",
    "city": "Paris",
    "country": "France"
  }
}
symfony jmsserializerbundle jms-serializer
2个回答
0
投票

是的,您可以使用@Accessor Annotation Tag of the JmsSerializer实现此目的:

可以在属性上定义此批注,以指定应调用哪个公共方法来检索,或设置给定属性的值:

在您的实体中,这可能如下所示:

# AppBundle/Entity/User
<?php
use JMS\Serializer\Annotation\Accessor;

class User
{


    /** 
     * @var AppBundle\Entity\Address
     * 
     * @Accessor(getter="getAddressAsString",setter="setAddress") 
     */
    private $address;

    // ...
    public function getAddressAsString()
    {
        return sprintf('%s, %s %s', $this->address->getStreet(), $this->address->Postcode(), $this->address->getCity()),
    }

    public function setAddress(Address $address)
    {
        $this->address = $address;
    }
}

0
投票

所以,这是一个适合我的解决方案:

  1. 定义要将字段序列化为的类型,即 / ** @var字符串 @Type(“string”)* / private $ address;
  2. serializer.pre_deserialize事件上实现订阅者/侦听者,即 class MyPreDeserializationSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents() { return [ [ 'event' => 'serializer.pre_deserialize', 'method' => 'onPreDeserialize', 'class' => Video::class, 'format' => 'json', ] ]; } public function onPreDeserialize(PreDeserializeEvent $event) { $data = $event->getData(); $data['address'] = implode(', ', $data['address']); $event->setData($data); } }
© www.soinside.com 2019 - 2024. All rights reserved.