无法对属性"publishedAt"值进行非规范化



我正在使用Serializer组件从json响应反序列化Posts。

$data = <<<EOF
{
"header": {
"error": 0,
"message": "ok",
"next": 2
},
"results": [
{
"id": 17007,
"title": "test article title 1",
"publishedAt": "28/09/2020"
},
{
"id": 17008,
"title": "sample article 2",
"publishedAt": "28/09/2020"
}
]
}
EOF;
$json = json_encode(json_decode($data)->results);
$normalizers = array(new ObjectNormalizer(),new  GetSetMethodNormalizer(), new ArrayDenormalizer());
$encoders = array(new JsonEncoder());
$serializer = new Serializer($normalizers, $encoders);
$posts = $serializer->deserialize($json, Post::class . '[]', 'json');
dd($posts); exit;

我得到这个例外:

无法取消规范化属性";出版日期:;类的值"应用程序\实体\发布":应为"类型的参数;DateTime"字符串";在属性路径";发表日期";。

我创建了这个简单的项目来向您展示我的代码https://github.com/ferrassi/sfDevs你知道我做错了什么吗?

我看到了你的github。你的做法是正确的,但你忘了做两件事:

  1. 将提取器传递给ObjectNormalizer,让他对标量以外的其他类型进行反规范化。请注意下面代码中的new ReflectionExtractor((
  2. 将$context传递给具有正确日期格式的DatetimeNormalizer,让他根据您的格式进行创建

这是工作代码:

$normalizers = array(
new DateTimeNormalizer([
DateTimeNormalizer::FORMAT_KEY => "d/m/Y",
]),
new ObjectNormalizer(
null,
null,
null,
new ReflectionExtractor()
),
new GetSetMethodNormalizer(),
new ArrayDenormalizer(),
);
$encoders = array(new JsonEncoder());
$serializer = new Serializer($normalizers, $encoders);
$posts = $serializer->deserialize($json, Post::class.'[]', 'json', [
DateTimeNormalizer::FORMAT_KEY => "d/m/Y",
]);

p.S.但有了自动布线,你可以:

$posts = $serializer->deserialize($json, Post::class.'[]', 'json', [
DateTimeNormalizer::FORMAT_KEY => "d/m/Y",
]);

$序列化程序是通过Symfony DI创建的

最新更新