Php Symfony2/JMS序列化程序-如何管理不同的对象结构?

Php Symfony2/JMS序列化程序-如何管理不同的对象结构?,php,json,symfony,jmsserializerbundle,Php,Json,Symfony,Jmsserializerbundle,以下是我的条令实体/php类的简化版本: /** * @ORM\Entity() */ class Command{ /** * @ORM\Column(type="integer") * @ORM\Id */ private $id; /** * @ORM\Column(type="string", length=50) */ private $customerName; /** *

以下是我的条令实体/php类的简化版本:

/**
 * @ORM\Entity()
 */
class Command{

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $customerName;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $customerNickname;

    // Other fields ...
}
通过基本的JMS Serialier捆绑包配置,我可以轻松地将一个“Command”对象序列化为类似JSON的对象:

{
   "id": "1",
   "customerName": "Logan",
   "customerNickname": "Wolverine",
   "..."
}
但是,在我的例子中,我需要的输出JSON格式是强制的,我希望有一个子对象结构,如:

{
   "id": "1",
   "customer":
   {
       "customerName": "Logan",
       "customerNickname": "Wolverine",
   }
}
因为在这种情况下我有很多类,所以我宁愿不改变我的类结构(php端)

除了“pre | post serialize”事件(对这样的事情来说似乎有点沉重)之外,我并没有在正式的JMS序列化程序包中找到解决方案

最简单的解决方案是什么


最好的问候

对于记录,您可能应该使用前/后序列化,但我找到了另一种解决方法。首先,我启用了元数据的读取:

# app/config/config.yml
jms_serializer:
    metadata:
        auto_detection: true
然后创建文件夹
App\CoreBundle\Resources\config\serializer\
,并创建相关文件
yaml
(例如
Entity.User.yml

然后我排除所有内容,并使用
virtual\u properties
以我希望的方式格式化数据

App\CoreBundle\Entity\User:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
    virtual_properties:
            getCustomer:
                serialized_name: customer
然后,我在我的用户实体中创建了一个方法,该方法以正确的格式返回我想要的数据。对你来说,比如:

public function getCustomer()
{
    return array(
        'customerName' => $this->getCustomerName(),
        'customerNickname' => $this->getCustomerNickname()
    );
}

您可以使用注释创建一个虚拟属性,而不是序列化两个属性

/**
 * @Serializer\VirtualProperty
 * @Serializer\SerializedName("customer")
 *
 * @return array
 */
public function getCustomer()
{
    return [
        'customerName' => $this->customerName, 
        'customerNickname' => $this->customerNickname
    ];
}

如果不想更改类,则必须使用前/后序列化正如您所说的,我最终将使用后/前序列化事件,因为我也必须处理反序列化,而虚拟财产不支持它:(.但这仍然是一个仅用于序列化目的的好anwser:)谢谢。最后,正如囚犯指出的,我也将使用事件来处理反序列化。