【问题标题】:Symfony3 deserialization of JSON does not work as expectedJSON 的 Symfony3 反序列化无法按预期工作
【发布时间】:2017-05-05 15:32:43
【问题描述】:

在 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());
 }

我正在尝试使用

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

有效载荷如下所示: {"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.name 中有一个字符串,在 Test.datum 中有一个 DateTime 对象。

出于这个原因,我在上面的函数中输入了回调。然而,回调永远不会被调用。

我做错了什么?

问候

奥利弗

【问题讨论】:

  • 我认为回调的主体可能是错误的。但是我注意到根本没有调用回调。

标签: php json symfony


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 2013-05-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多