在JMS序列化器中混合访问器和SkipWhenEmpty

我在一个项目中使用JMS序列化程序,而我正为一件事情而苦苦挣扎。


我正在使用@Accessor批注(在DateTime属性上)仅回显日期,而没有时间。但是在我的某些对象上,我没有任何信息,并且我不希望在这种情况发生时输出日期密钥。


没有@Accessor,我可以很容易@SkipWhenEmpty地在其他属性上完美使用它。但是看来我不能将两者混在一起吗?


这是我的示例代码:


composer.json:


{

    "require": {

        "jms/serializer": "^1.14"

    }

}

StackOverflowExample.php:


<?php


declare(strict_types=1);


use JMS\Serializer\Annotation as Serializer;


class StackOverflowExample

{

    /**

     * @var \DateTime

     * @Serializer\Accessor(getter="getDate")

     * @Serializer\SkipWhenEmpty()

     */

    private $date;


    /**

     * @var string

     * @Serializer\SkipWhenEmpty()

     */

    private $title;


    public function getDate(): string

    {

        if (null === $this->date) {

            return '';

        }


        return $this->date->format('Y-m-d');

    }


    public function setDate(\DateTime $date): void

    {

        $this->date = $date;

    }


    public function getTitle(): string

    {

        return $this->title;

    }


    public function setTitle(string $title): void

    {

        $this->title = $title;

    }

}

执行时stackoverflow.php,这是它输出的数据:


{"date":"2019-05-03","title":"Example with date and title"}

{"date":"2019-05-03"}

{"date":"","title":"Example with title but no date"}

第一行是一个控件。


在第二行,当省略设置标题时,输出的json中没有“ title”键,这要归功于 @SkipWhenEmpty


但是在第三行,即使使用@SkipWhenEmpty,我仍然具有日期键。


有什么我要忘记的吗?仅当填满日期字段时,如何才能回显日期字段?


蛊毒传说
浏览 143回答 1
1回答

慕慕森

根据我的研究,我认为您需要返回null而不是返回 '';在您的getDate函数中。看
打开App,查看更多内容
随时随地看视频慕课网APP