У меня есть объект 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.