Symfony SerializerInterface 将 json 反序列化为类不起作用

Posted

技术标签:

【中文标题】Symfony SerializerInterface 将 json 反序列化为类不起作用【英文标题】:Symfony SerializerInterface deserialize json to class not working 【发布时间】:2020-08-24 13:15:16 【问题描述】:

这是我的控制器代码,用于接收带有 JSON 正文的 POST 请求,然后我想反序列化到我的 dto 中。听起来很容易,但由于某种原因不能按预期工作。属性之一是对象数组,当反序列化时,它被反序列化为数组数组

控制器:

<?php

namespace App\Controller;

use Symfony\Component\Serializer\SerializerInterface;
use App\Dto\CreateDto;

class EntryController extends AbstractController

    public function __construct(SerializerInterface $serializer)
    
        $this->serializer = $serializer;
    

    /**
     * @Route("", methods="POST")
     *
     */
    public function createEntry(Request $request)
    
        $content = $request->getContent();

        $entry = $this->serializer->deserialize($content, CreateDto::class, 'json');

        ...
    

DTO:

<?php

namespace App\Dto;


class CreateDto

    public $name;
    public $email;
    public $items; // this is CreateDto[]

我使用正文内容类型为 json 的邮递员 POST 请求发出请求

 
        "name": "Example",
        "email": "example@example",
        "items": [
               
                  "name": "sub",
                  "email": "somethig@example.com"
               
         ]
    

Symfony 5.0.8 版

【问题讨论】:

【参考方案1】:

您需要声明哪些字段是序列化或反序列化的。

<?php

namespace App\Dto;

use Symfony\Component\Serializer\Annotation\Groups;


class CreateDto

    /**
     * @Groups("api"")
     */
    public $name;
    /**
     * @Groups("api"")
     */
    public $email;
    /**
     * @Groups("api"")
     */
    public $items; // this is CreateDto[]

之后

 $entry = $this->serializer->deserialize($content, CreateDto::class, 'json', ["groups" => "api"]);

将序列化程序指定给要序列化或反序列化的组。就这样。

【讨论】:

嗨,在我的例子中,属性是反序列化的,但是反序列化对象中的属性“items”不是我期望的对象数组,而是每个“item”所在的数组数组对象是数组 @StackNet 那么你需要输入 $items 类型。 symfony.com/doc/current/components/… 看那个。 你的意思是在属性 $items 上添加 /** * @var self[] */ 吗?因为我试过了,但同样的问题。仍在反序列化为数组数组 我不完全确定,但添加“@var self[]”或“@var CreateDto[]”必须解决您的问题。但问题是 $items 类型。您需要告诉序列化程序 $items 属性是“CreateDto”类型,然后序列化程序会将其反序列化为 CreateDto 对象而不是数组。 恐怕没有。仍然调试器说它的数组

以上是关于Symfony SerializerInterface 将 json 反序列化为类不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Symfony控制器教程已开课

symfony/skeleton 和 symfony/website-skeleton

WordPress 作为 Symfony (Symfony3) 子目录

Symfony 4 捆绑包工作

从 Symfony 3.4 升级到 4:升级 symfony 时出错

symfony2的中文视频教程更新中(原创),对Symfony感兴趣的学员可以看下