Symfony – десериализовать json для массива объектов

У меня есть объект json, который я получил, получив вызов API. Я делаю этот вызов для получения списка объектов. Это список сообщений … Итак, у меня есть массив Post Objects.

Здесь вывод:

{ "total":2, "data":[ { "id":2, "user":{ "id":1, "username":"sandro.tchikovani" }, "description":"cool", "nb_comments":0, "nb_likes":0, "date_creation":"2014-04-13T20:07:34-0700" }, { "id":1, "user":{ "id":1, "username":"sandro.tchikovani", }, "description":"Premier pooooste #lol", "nb_comments":0, "nb_likes":0, "date_creation":"2014-04-13T15:15:35-0700" } ] } 

Я хотел бы десериализовать часть данных … Проблема в том, что Serializer в Symfony дает мне ошибку …

Ошибка, которая у меня есть:

 Class array<Moodress\Bundle\PosteBundle\Entity\Poste> does not exist 

Как я десериализую:

 $lastPosts = $serializer->deserialize($data['data'], 'array<Moodress\Bundle\PosteBundle\Entity\Poste>', 'json'); 

Как я могу десеризовать массив данных … Чтобы иметь массив сообщений. Я хочу дать на мой взгляд .twig массив Poste … Я точно уточнил тип, когда я deserialize … Поэтому я не могу найти, в чем проблема …

Благодарю.

Ошибка довольно ясна. Ваша строка не соответствует существующему классу.

Пример в официальной документации гласит:

 $person = $serializer->deserialize($data,'Acme\Person','xml'); 

В вашем случае это должно быть больше похоже:

 $person = $serializer->deserialize($data['data'],'Moodress\Bundle\PosteBundle\Entity\Poste','json'); 

Обновить:

Хорошо, тогда.

Во-первых, ваш json-файл кажется недействительным (используйте http://jsonlint.com/ для его проверки). Будьте осторожны.

Во-вторых, вам нужно будет получить ваш json в виде массива с

 $data = json_decode($yourJsonFile, true); 

и затем вы можете получить доступ к каждому массиву данных с помощью

 foreach($data['data'] as $result) { /* Here you can hydrate your object manually like: $person = new Person(); $person->setId($user['id']); $person->setDescription($user['description']); Or you can use a denormalizer. */ } 

Я считаю, что лучшим решением здесь является создание нового класса PosteResponse, такого как:

 namespace Moodress\Bundle\PosteBundle\Response; use JMS\Serializer\Annotation\Type; class PosteResponse { /** * @Type("integer") */ private $total; /** * @Type("array<Moodress\Bundle\PosteBundle\Entity\Poste>") */ private $data; // Getters and setters here... } 

и десериализуйте свой ответ на этот класс:

 $response = $serializer->deserialize( $json, 'Moodress\Bundle\PosteBundle\Response\PosteResponse', 'json' ); $posts = $response->getData(); 

Это сделает этот трюк, и он не требует, чтобы вы расшифровывали и кодировали ваш json вручную, что, по моему мнению, очень странно.

Менее идеальным решением, которое я нашел, было сначала декодировать, а затем снова закодировать json-данные на узле, который представляет массив данных. Например, в вашем случае:

 $json = json_decode($json); $json = json_encode($json->data); $serializer->deserialize($json, 'array<Moodress\Bundle\PosteBundle\Entity\Poste>', 'json'); 

Там должно быть лучшее решение, чем это, но это кажется более элегантным, чем вышеупомянутое решение де-сериализации json.