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/skeleton 和 symfony/website-skeleton
WordPress 作为 Symfony (Symfony3) 子目录