Как я могу десериализовать массив объектов в Symfony Serializer?

Это возможно в Symfony Serializer десериализовать массив объектов в свойстве? у меня есть Boss класс с $Npc = [] свойство, которое должно содержать массив Npc объекты. Я видел некоторые примеры в документации, но они не описывают эту функцию. У меня есть строка JSON с массивом NPC, например:

class Boss {

private $Npc = [];

/**
* @return Npc[]
*/
public function getNpcs(): array
{
return $this->npcs;
}
}

Я использую php7.1 и symfony / serializer версии ^ 3.3.

Редактировать:
Я уже пробовал PhpDocExtractor, но он не позволил мне установить его. 🙁

Редактировать:
Это возможное значение JSON:

{
"bossname": "Epic boss!",
"npcs": [{
"id": 24723,
"name": "Selin Fireheart",
"urlSlug": "selin-fireheart",
"creatureDisplayId": 22642
}]
}

5

Решение

Я нашел способ сделать это :). Я установил пакет Symfony PropertyAccess через Composer. С помощью этого пакета вы можете добавлять сумматоры, съемники и хасеры. Таким образом, Symfony Serializer автоматически заполнит массив правильными объектами.
Пример:

private $npcs = [];

public function addNpc(Npc $npc): void
{
$this->npcs[] = $npc;
}

public function hasNpcs(): bool
{
return count($this->npcs) > 0
}

и т.п.

Таким образом, вы можете использовать ObjectNormalizer с:

$normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());
4

Другие решения

Я боролся с этим много часов без результата.
Каждый раз, когда я добавлял функцию сумматора, объектный нормализатор хотел вызвать эту функцию, но получал сообщение об ошибке типа «Поле xyz должно иметь тип xyz [], задан массив».

Это потому, что я забыл добавить arraynormalizer в пул нормализатора сериализатора. После добавления все работало нормально.

Надеюсь, это полезно для кого-то.

1

Да, вы можете десериализовать массив, но вам нужно предоставить для второго параметра объект, а также информацию, что это на самом деле массив. Вы можете сделать это так:

use Symfony\Component\Serializer\Serializer;

class Boss {

private $Npc = [];

/**
* @return Npc[]
*/
public function getNpcs(): array
{
return $serializer->deserialize($this->npcs, 'Acme\Npc[]', 'json');

}
}

Вы можете найти больше информации об этом в документации по обработка массивов

-1
По вопросам рекламы [email protected]