JMS 序列化程序。 Xml 对象数组的标签名称

JMS serializer. Xml tag name for array of objects

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

我有一个名为 "reference" 的实体。 使用注解@XmlRoot("reference") 只返回一个对象,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,因为我没有持有参考项目的父实体...)

谢谢!

首先,我认为您预期的 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"
        }
    ]
}