Документация Symfony 3.4 гласит следующее для десериализации массивов:
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Serializer;
$serializer = new Serializer(
array(new GetSetMethodNormalizer(), new ArrayDenormalizer()),
array(new JsonEncoder())
);
$data = ...; // The serialized data from the previous example
$persons = $serializer->deserialize($data, 'Acme\Person[]', 'json');
Строка json выглядит следующим образом:
[{ «Имя»: «Foo», «возраст»: 99, «спортсмен» ложь}, { «имя»: «бар», «возраст»: 33, «спортсмен»: истинно}]
Поэтому я попытался сделать то же самое с моей структурой XML. Это не настоящая структура, так как я проверяю это.
Структура XML:
<<<EOF
<response>
<book>
<titulo>foo</titulo>
<isbn>99</isbn>
<autor>Autor</autor>
<editor>Editor</editor>
</book>
<book>
<titulo>foo2</titulo>
<isbn>100</isbn>
<autor>Autor2</autor>
<editor>Editor2</editor>
</book>
</response>
EOF;
Ответ — это имя корневого узла по умолчанию. У меня есть сущность Book с полями, определенными одинаково.
Я пытаюсь десериализовать так:
use AppBundle\Entity\Book;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
$encoders = array(new XmlEncoder(), new JsonEncoder());
$normalizers = array(new GetSetMethodNormalizer(), new ArrayDenormalizer());
$serializer = new Serializer($normalizers, $encoders);
$serializer->deserialize($data, 'AppBundle\Entity\Book[]', 'xml');
Когда я делаю var_dump для переменной десериализации, вывод выглядит следующим образом:
array (1) {[«book»] => объект (AppBundle \ Entity \ Book) # 385 (11) {[«isbn»: protected] => NULL [«автор»: защищен] => NULL [«titulo» : protected] => NULL [«fecha_ini»: защищено] => NULL [«fecha_fin»: protected] => NULL [«редактор»: защищено] => NULL [«imgUrl»: protected] => NULL [«cod_autor» : protected] => NULL [«cod_editorial»: защищено] => NULL [«cod_coleccion»: protected] => NULL [«cod_mat»: protected] => NULL}}
Данные не распознаются, и массив имеет только один элемент, когда я ожидаю 2 элемента.
Кто-то испытывает что-то подобное? Можете ли вы помочь мне, где искать решение?
Заранее спасибо.
Задача ещё не решена.
Других решений пока нет …