在 Symfony 4 中将 json 反序列化为具有嵌套 DateTime 对象的实体
Deserialize json to entity with nested DateTime object in Symfony 4
我有一个包含名为 completedAt
的 DateTimeInterface
类型字段的实体,我想将 JSON 对象反序列化为该实体对象。
我尝试了 DateTimeNormalizer
和 ObjectNormalizer
,但它们都给我一个错误,说我不能将 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);
应该可以正常工作
感谢您在这个问题下的回答: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
我有一个包含名为 completedAt
的 DateTimeInterface
类型字段的实体,我想将 JSON 对象反序列化为该实体对象。
我尝试了 DateTimeNormalizer
和 ObjectNormalizer
,但它们都给我一个错误,说我不能将 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);
应该可以正常工作
感谢您在这个问题下的回答: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