JSON的Symfony3反序列化无法按预期工作

时间:2016-12-20 12:04:33

标签: php json symfony

在Symfony控制器中我有以下功能:

/**
 *
 * @Route("/test", name="post_test")
 * @Method("POST")
 */   
 public function postTest(Request $request){
    $normalizer = new GetSetMethodNormalizer();

    $callback = function ($dateTime) {
       return $dateTime instanceof DateTime ? $dateTime->format(DateTime::ISO8601) : '';
    };

    $normalizer->setCallbacks(array('datum' => $callback));
    $encoder = new JsonEncoder();
    $serializer = new Serializer(array($normalizer), array($encoder));

    $test = $serializer->deserialize($request->getContent(),Test::class, 'json');
    return new Response($test->getName().":".$test->getDatum());
 }

我正在尝试通过卷曲

进行POST
curl -i -X POST http://127.0.0.1:8000/test -d '{"datum": "2016-12-20T09:01:41+0100", "name": "Alfons"}'

Payload看起来像: {“name”:“John Doe”,“datum”:“2016-12-20T09:01:41 + 0100”}

JSON应该序列化的类是这样的:

class Test {
    private $name;
    private $datum;

    public function getName(){
        return $this->name;
    }

    public function setName($name){
        $this->name = $name;
    }

    public function getDatum(){
        return $this->datum;
    }

    public function setDatum($datum){
        $this->datum = $datum;
    }
}

我的JSON被反序列化,这很好。但是结果是Test.name和Test.datum中的两个字符串。我真正想要的是在Test.dname中有一个字符串,在Test.datum中有一个DateTime对象。

因此我在上面的函数中输入了回调。但是从不调用回调。

我做错了什么?

此致

奥利弗

1 个答案:

答案 0 :(得分:1)

不幸的是,回调只在序列化过程中调用,而不是在反序列化过程中调用。请参阅仅在callbacks方法中使用的source codenormalize()。所以,你可以:

  • a)例如,在setter中手动创建DateTime对象。
  • b)制作自己的Normalizer实现(例如扩展GetSetMethodNormalizer)。
  • c)使用其他第三方解决方案,例如JMS Serializer,它允许声明属性type以进行反序列化。