序列化器 - 规范化器的序列化器对象需要什么来将 json 反序列化为对象

Serializer - What does the serializer object needs of normalizers to deserialize json into object

我要转换这个json

[
    {
        "name": "1",
        "created": "2019-12-08T15:43:00.000Z"
    },
    {
        "name": "2",
        "created": "2019-12-08T15:43:00.000Z"
    }
]

到单个对象中。

class Persons
{
    /**
     * @var array<Person>
     */
    public array $persons = [];
}

class Person
{
    public string $name = '';
    public DateTimeInterface $created;
}

我用它作为我的序列化程序

$encoder = [
    new JsonEncoder(),
];

$normalizer = [
    new DateTimeNormalizer(),
    new ObjectNormalizer(),
];

$serializer = new Serializer($normalizer, $encoder);

当运行这个

$persons = $serializer->deserialize($json, Persons::class, 'json');
var_dump($persons);

$persons是一个空数组

那么我需要哪些规范化程序才能工作?

是的,那是因为您需要将操作与 encoder/decoder 匹配 - JsonEncoder 用于 serializeJsonDecoder 用于 deserialize 调用 :)

添加JsonDecoder后,我相信它应该可以工作...

您的 json 不代表一个 Persons 对象,它是一个 Persons 数组。根据 https://symfony.com/doc/current/components/serializer.html#handling-arrays 您可以将 [] 附加到您的 class 名称以反序列化对象数组:

$persons = $serializer->deserialize($json, Person::class.'[]', 'json');

那么,$persons 应该是一个 Person 对象数组。请注意 Person::class 是单数,不是复数。

要反序列化为 Persons::class - 如果您出于任何原因坚持 - 您的 json 要么必须嵌入到以下 json

{"persons": <here your json>} 

或者您需要实现自己的序列化器(更具体地说,是您自己的非规范化器),并跳过一些步骤才能使用它。 (我不太确定,但我相信 php 中对象数组的预期文档表示法是 @var []Person