Сериализатор - что требуется объекту сериализатора от нормализаторов для десериализации json в объект - PullRequest
0 голосов
/ 25 мая 2020

Я хочу преобразовать этот 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 это пустой массив

Итак, какие нормализаторы мне нужны, чтобы это работало?

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

ваш json не представляет собой объект Persons, это массив лиц. согласно https://symfony.com/doc/current/components/serializer.html#handling -массивы вы можете добавить [] к имени вашего класса, чтобы десериализовать массив объектов:

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

Тогда $persons должен быть массивом Person объекты. Обратите внимание, что Person :: class является единственным, а не множественным числом.

Для десериализации в Persons :: class - если вы настаиваете по какой-либо причине - ваш json должен быть встроен в следующее json

{"persons": <here your json>} 

или вам нужно реализовать собственный сериализатор (точнее, c, ваш собственный денормализатор) и прыгнуть через несколько обручей, чтобы использовать его. (Я не совсем уверен, но полагаю, что ожидаемая нотация do c для массивов объектов в php равна @var []Person)

0 голосов
/ 26 мая 2020

Да, это потому, что вам нужно сопоставить операцию с кодировщиком / декодером - JsonEncoder для serialize и JsonDecoder для deserialize вызовов:)

После добавления JsonDecoder, I верю, это должно работать ...

...