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
应该是一个属性。下面的例子就是这样做的。查看底部的结果。如果您想要更多示例,请查看下面的链接,它们会教给您很多东西。
- Validating, serialising and mapping XML request to model classes
- Validating, serialising and mapping json and XML requests to model classes
结果
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"
}
]
}
我在使用 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
应该是一个属性。下面的例子就是这样做的。查看底部的结果。如果您想要更多示例,请查看下面的链接,它们会教给您很多东西。
- Validating, serialising and mapping XML request to model classes
- Validating, serialising and mapping json and XML requests to model classes
结果
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"
}
]
}