@dinya17

Symfony serializer как десериализовать массив с объектами?

Есть похожий вопрос, но ясности он пока не внес Как реализовать десериализацию иерархии вложенных объектов с помощью Symfony Serializer?

Мой вопрос.
Есть вот такая крутая штука
https://symfony.com/doc/current/components/seriali...
Я использую ее для превращения JSON в валидный экземпляр класса.
Все бы хорошо, но я уткнулся в проблему, когда мне надо присвоить в свойство класса массив с объектами.
Пример
class ContragentDto
{
    /**
     * @var Phone[]
     */
    private $phones = [];

 /**
     * @return Phone[]
     */
    public function getPhones(): array
    {
        return $this->phones;
    }

    /**
     * @param Phone[] $phones
     */
    public function setPhones(array $phones): void
    {
        $this->phones = $phones;
    }


}

$normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());
$serializer = new Serializer([$normalizer]);
return $serializer->denormalize($array, ContragentDto::class);


Пример JSON

{
	"uuid": "00004539-73d6-4211-8a32-913bd34f3c8b",
	"phones": [
				{
					"id": 6082892,
					"type": "mob",
					"number": "+79818"
				},
							 {
					"id": 60828927,
					"type": "mob",
					"number": "+7988"
				}
			],
}';

Все хорошо, за исключением того, что в phones прилетает не массив с экземплярами класса, а массив с json объектами.

Как сделать чтобы массив тоже валидно десериализовался?
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
$reflectionExtractor = new ReflectionExtractor();
$phpDocExtractor = new PhpDocExtractor();
$propertyTypeExtractor = new PropertyInfoExtractor([$reflectionExtractor], [$phpDocExtractor, $reflectionExtractor], [$phpDocExtractor], [$reflectionExtractor], [$reflectionExtractor]);

$normalizer = new ObjectNormalizer(null, null, null, $propertyTypeExtractor);
$arrayNormalizer = new ArrayDenormalizer();
$serializer = new Serializer([$arrayNormalizer, $normalizer]);
return $serializer->denormalize($array, ContragentDto::class);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы