【问题标题】:Deserialize json to entity with nested DateTime object in Symfony 4在 Symfony 4 中将 json 反序列化为具有嵌套 DateTime 对象的实体
【发布时间】:2019-03-28 03:14:50
【问题描述】:

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

我尝试了DateTimeNormalizerObjectNormalizer,但它们都给了我一个错误,说我无法将字符串/数组分配给 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 属性路径“completedAt”中给出的“DateTimeInterface”、“字符串”类型的预期参数。

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

【问题讨论】:

  • 您能向我们展示您发送的 JSON 有效负载吗?
  • @thomas.drbg 更新了描述。谢谢。

标签: symfony symfony4


【解决方案1】:

如果您希望将您的 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

【讨论】:

  • 直接从我的控制器尝试了你的方法,但它仍然给我这个错误:预期的参数类型为“DateTimeInterface”,属性路径“completedAt”中给出的“字符串”。
  • 我们可以看看你的控制器吗?
  • 我找到了原因!我没有这个包:symfony/property-info。感谢您的帮助。
【解决方案2】:
猜你喜欢
  • 2021-09-21
  • 2018-09-19
  • 2019-07-07
  • 2018-09-21
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2016-12-12
  • 2017-12-28
相关资源
最近更新 更多