JMS序列化器。对象数组的Xml标记名称

时间:2017-04-25 14:51:09

标签: php rest symfony jmsserializerbundle

我在使用jms序列化程序和symfony 3获得xml输出时遇到了一些麻烦。

我有一个名为" reference"的实体。 使用注释@XmlRoot("引用")并仅返回一个对象,fos rest bundle的xml输出符合预期:

<reference>
  <id>1</id>
  <title>Title 1</title>
</reference>

但是如果我输出相同对象的数组(由doctrines findAll()方法返回),我得到这个:

<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>

标记名为<entry>,但我想实现此目的:

<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>

(在这种情况下,我不知道如何使用@XmlList,因为我没有父实体持有参考项......)

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您预期的XML格式不适合我。 id应该是一个属性。下面的例子就是这样。查看底部的结果。如果您想要更多示例,请查看下面的链接,这些链接可以为您提供很多帮助。

<强>结果

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 = [];
}

<强>参考

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;
}

此设置应该为您提供:

<result>
   <references>
      <reference id="1">Title 1</reference>
      <reference id="2">Title 2</reference>
      <reference id="3">Title 3</reference>
   </references>
</result>

如果你的回复是一个json对象,那么就像这样:

{
    "references": [
        {
            "id": 1,
            "title": "Title 1"
        },
        {
            "id": 2,
            "value": "Title 2"
        },
        {
            "id": 3,
            "value": "Title 3"
        }
    ]
}