在 Symfony 4 中将 json 反序列化为具有嵌套 DateTime 对象的实体

Deserialize json to entity with nested DateTime object in Symfony 4

我有一个包含名为 completedAtDateTimeInterface 类型字段的实体,我想将 JSON 对象反序列化为该实体对象。

我尝试了 DateTimeNormalizerObjectNormalizer,但它们都给我一个错误,说我不能将 string/array 分配给 DateTime 对象。

比如我有这个实体,

class Task
{
    private $id;
    private $name;

    /**
     * @var DateTimeInterface
     */
    private $completedAt;
}

以及我如何在测试中使用 PHPUnit 创建 JSON 对象,

$rawData = json_encode([
    'name' => 'test-task',
    'completedAt' => Carbon::now()->toRfc3339String(),
    // I tried some other formats here, such as datetime array, datetime string, etc.
]);

在我的控制器中,我尝试了这个(这是一个测试,不是我的真实代码):

public function update(Request $request, Task $task, SerializerInterface $serializer): Response
{
    $task = new Task();
    $task->setName('test');
    $task->setCompletedAt(Carbon::now()->toDateTime());

    $json = $serializer->serialize($task, 'json');

    $serializer = new Serializer([new ObjectNormalizer(), new DateTimeNormalizer()], [new JsonEncoder()]); // array of needed normalizer
    var_dump($serializer->deserialize($json, Task::class, 'json'));
}

我遇到了这个错误,

NotNormalizableValueException Expected argument of type "DateTimeInterface", "string" given at property path "completedAt".

如何使用多个规范化器反序列化 JSON 对象?

如果您希望将 json 数据转换为您创建的实体并使用 symfony 序列化器

$serializer = new Serializer([new ObjectNormalizer()]); // array of needed normalizer
$serializer->denormalise($json_data,YourEntity::class);

应该可以正常工作

https://symfony.com/doc/current/components/serializer.html

感谢您在这个问题下的回答:deserializing json to embedded object in Symfony 3.2 - Expected argument of type "Acme\StoreBundle\Document\Gps", "array" given

通过遵循 Symfony 文档:https://symfony.com/doc/current/components/serializer.html#recursive-denormalization-and-type-safety

我发现我没有安装这个包:symfony/property-info