【问题标题】:Symfony2 custom json serializationSymfony2 自定义 json 序列化
【发布时间】:2013-12-03 10:09:50
【问题描述】:

我想知道如何在实体上使用 JMS 来拟人化默认 JSON 序列化。

我有一个与对象 B 具有 OneToMany 关系的对象 A。
我从 A 对象中公开对象 B 和 attrA。

但是没有基本的 JSON

{'attrA' : 'foo', 'Bs' : {{'attrB' : 'bar'}, {'attrB' : 'baz'}, ...} }

我想拥有

{'attrA' : 'foo', 'Bs' : {'bar', 'baz', ...}}

有可能吗?

【问题讨论】:

    标签: json symfony serialization doctrine


    【解决方案1】:

    一种方法是使用serializer's annotations

    我假设你的值对象看起来像这样

    class Foo
    {
        /**
         * @var string
         */
        private $attrA;
    
        /**
         * @var ArrayCollection<Bar>
         */
        private $bs;
    }
    
    class Bar
    {
        /**
         * @var string
         */
        private $attrB;
    }
    

    导入注释

    首先,如果您还没有,您需要在文件顶部导入注释

    use JMS\Serializer\Annotation as Serializer;
    

    设置自定义 getter

    默认情况下,JMS 序列化器通过反射获取属性值。我的想法继续为序列化创建custom accessor
    注意:我假设您的bs 属性是ArrayCollection。如果没有,你可以使用array_map

    // Foo.php
    
    /**
     * @Serializer\Accessor(getter="getBarArray")
     */
    private $bs;
    
    /**
     * @return ArrayCollection<string>
     */
    public function getBarArray()
    {
        return $this->getBs()->map(function (Bar $bar) {
            return $bar->getAttrB();
        });
    }
    

    设置自定义Accessor(getter) 将强制序列化程序使用getter 而不是反射。这样,您可以调整任何属性值以获取所需格式。

    结果

    这些值对象的序列化会导致

    {'attrA' : 'foo', 'Bs' : ['bar', 'baz', ...]}
    

    【讨论】:

    • 非常感谢,这正是我所期待的 :)
    猜你喜欢
    • 2016-01-07
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    相关资源
    最近更新 更多