如何将额外字段添加到实体的序列化JSON中

时间:2017-10-28 14:00:04

标签: php json symfony serialization doctrine-orm

我想为JSON编码实体添加额外的字段。但是这个字段不会出现在数据库中。它只是一个虚拟字段或函数。我有这样的实体;

/**
 * @ORM\Table(name="sample_table")
 * @ORM\Entity()
 */
class InstagramUser
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $userName;

    /**
     * @ORM\Column(type="string", nullable=true)
     */
    private $fullName;

    ...

    private $extraField = "EXTRA_FIELD";

}

通常情况下,Symfony会像这样序列化这个实体;

[{
    "id": 1,
    "userName": "USER_NAME",
    "fullName": "FULL_NAME"
},...]

问题:我想将此字段添加到JSON数据中。我怎样才能做到这一点?我想得到像这样的JSON;

[{
    "id": 1,
    "userName": "USER_NAME",
    "fullName": "FULL_NAME",
    "extraField": "EXTRA_FIELD"
},...]

1 个答案:

答案 0 :(得分:0)

我找到了一个使用JMS的解决方案。首先,安装JMS。您可以在此网址中找到详细信息:https://jmsyst.com/libs/serializer

之后,修改这样的类;

/**
 * @ORM\Table(name="sample_table")
 */
class UserTable
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $userName;

    /**
     * @ORM\Column(type="string", nullable=true)
     */
    private $fullName;

    ...

    /**
     * @VirtualProperty
     * @SerializedName("extraField")
     * @return string
     */
    public function getExtraField(){
        return "EXTRA_FIELD";
    }

}

最后,使用以下方法返回JSON。

$serializer = SerializerBuilder::create()->build();
$jsonContent = $serializer->serialize($user, 'json');

return new JsonResponse($jsonContent, 200, array(), true);

但我不知道这种方法的效果如何。