【问题标题】:Failed to denormalize attribute "publishedAt" value无法对属性“publishedAt”值进行非规范化
【发布时间】:2020-10-21 14:07:59
【问题描述】:

我正在使用 Serializer 组件从 json 响应中反序列化帖子。

        $data = <<<EOF
        {
            "header": {
            "error": 0,
            "message": "ok",
            "next": 2
            },
            "results": [
            {
            "id": 17007,
            "title": "test article title 1",
            "publishedAt": "28/09/2020"
            },
            {
            "id": 17008,
            "title": "sample article 2",
            "publishedAt": "28/09/2020"
            }
            ]
        }
        EOF;
        $json = json_encode(json_decode($data)->results);
        $normalizers = array(new ObjectNormalizer(),new  GetSetMethodNormalizer(), new ArrayDenormalizer());
        $encoders = array(new JsonEncoder());
        $serializer = new Serializer($normalizers, $encoders);
        $posts = $serializer->deserialize($json, Post::class . '[]', 'json');
dd($posts); exit;

我得到了这个例外:

未能对类的属性“publishedAt”值进行非规范化 “App\Entity\Post”:“DateTime”、“string”类型的预期参数 在属性路径“publishedAt”中给出。

我创建了这个简单的项目来向您展示我的代码 https://github.com/ferrassi/sfDevs 你知道我做错了什么吗?

【问题讨论】:

  • 尝试添加DateTimeNormalizer
  • 我添加了 DateTimeNormalizer,不起作用

标签: php symfony


【解决方案1】:

我看到了你的 github。你的方法是对的,但你忘了做两件事:

  1. 将提取器传递给 ObjectNormalizer,让他对标量以外的其他类型进行非规范化。注意下面代码中的new ReflectionExtractor()
  2. 使用正确的日期格式将 $context 传递给 DatetimeNormalizer,让他根据您的格式创建

这是工作代码:

        $normalizers = array(
            new DateTimeNormalizer([
                DateTimeNormalizer::FORMAT_KEY => "d/m/Y",
            ]),
            new ObjectNormalizer(
                null,
                null,
                null,
                new ReflectionExtractor()
            ),
            new GetSetMethodNormalizer(),
            new ArrayDenormalizer(),
        );
        $encoders = array(new JsonEncoder());

        $serializer = new Serializer($normalizers, $encoders);
        $posts = $serializer->deserialize($json, Post::class.'[]', 'json', [
            DateTimeNormalizer::FORMAT_KEY => "d/m/Y",
        ]);

附:但是通过自动装配,您可以:

$posts = $serializer->deserialize($json, Post::class.'[]', 'json', [
    DateTimeNormalizer::FORMAT_KEY => "d/m/Y",
]);

$serializer 是通过 Symfony DI 创建的

【讨论】:

    猜你喜欢
    • 2021-03-13
    • 2013-03-08
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2016-11-12
    • 2017-06-09
    相关资源
    最近更新 更多