【问题标题】:Make JMS Serializer not populate null values instead of defaults使 JMS 序列化程序不填充空值而不是默认值
【发布时间】:2019-04-28 21:04:56
【问题描述】:

反序列化的 JMS 序列化程序 1.* 仅填充输入中提供的那些字段。例如,我们有如下代码:

$criteria = $this->serializer->deserialize($request->getContent(), SearchCriteria::class, 'json');

当请求中没有提供 limit 字段时,它采用默认值,在类属性中定义,即

class SearchCriteria {
    // ...
    private $limit = 10;
    // ...
}

迁移到 JMS Serializer 2.0 后,此行为发生了变化 - 现在它用 null 覆盖了 limit 字段,这破坏了我们的逻辑。有没有办法配置旧行为?我们使用带有 jms/serializer-bundle@3.0.0 的 Symfony 4。

这里是jms_serializer.yaml

jms_serializer:
    default_context:
        serialization:
            serialize_null: false
        deserialization:
            serialize_null: false

【问题讨论】:

    标签: php symfony4 jmsserializerbundle jms-serializer


    【解决方案1】:

    所以到目前为止我发现的最佳解决方法是使用 PostDeserialize 注释 (https://jmsyst.com/libs/serializer/master/reference/annotations#postdeserialize) 并手动设置默认值,例如:

    /**
     * @JMS\PostDeserialize()
     */
    public function postDeserialize()
    {
        $this->limit = $this->limit ?? 10;
    }
    

    它看起来很丑,但很有效。

    【讨论】:

    • 这很荒谬(不是您的解决方案,而是没有其他方法)。如果 null 值只是通过反射写入到属性中,@Type-annotations 是什么?
    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2011-12-16
    • 2021-08-22
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多