Tengo algunos problemas para obtener la salida xml que espero usando el serializador jms y Symfony 3.
Tengo una entidad llamada "referencia". Usando la anotación @XmlRoot("referencia") y devolviendo un solo objeto, la salida xml de fos rest bundle es la esperada:
<reference> <id>1</id> <title>Title 1</title> </reference>
Pero si saco una matriz de los mismos objetos (devueltos por el método findAll()
de las doctrinas), obtengo esto:
<result> <entry> <id>1</id> <title>Title 1</title> </entry> <entry> <id>2</id> <title>Title 2</title> </entry> <entry> <id>3/id> <title>Title 3</title> </entry> </result>
La etiqueta se llama <entry>
pero me gustaría lograr esto:
<result> <reference> <id>1</id> <title>Title 1</title> </reference> <reference> <id>2</id> <title>Title 2</title> </reference> <reference> <id>3/id> <title>Title 3</title> </reference> </result>
(No sé cómo usar @XmlList
en este caso, porque no tengo una entidad principal que contenga los elementos de referencia...)
¡Gracias!
En primer lugar, su XML esperado no está bien formateado para mí. La id
debería ser un atributo en su lugar. El siguiente ejemplo lo hace. Ver el resultado en la parte inferior. Si desea más ejemplos, consulte los enlaces a continuación que le enseñarán mucho.
Resultado
namespace Application/YourBundle/Model; use Application/YourBundle/Model/Reference; use JMS\Serializer\Annotation as Serializer; /** * @Serializer\XmlRoot("result") */ class Result { /** * @var Reference[] * * @Assert\Valid(traverse="true") * * @Serializer\XmlList(inline=false, entry="reference") * @Serializer\Type("array<Application\YourBundle\Model\Reference>") */ public $references = []; }
Referencia
namespace Application/YourBundle/Model; use JMS\Serializer\Annotation as Serializer; class Reference { /** * @var int * * @Serializer\Type("integer") * @Serializer\XmlAttribute */ public $id; /** * @var string * * @Serializer\Type("string") * @Serializer\XmlValue */ public $title; }
Esta configuración debería darte:
<result> <references> <reference id="1">Title 1</reference> <reference id="2">Title 2</reference> <reference id="3">Title 3</reference> </references> </result>
Si su respuesta fuera un objeto json, sería así:
{ "references": [ { "id": 1, "title": "Title 1" }, { "id": 2, "value": "Title 2" }, { "id": 3, "value": "Title 3" } ] }