创建REST / XML Web服务并显示List
个对象时:列表元素是否应包含在列表元素中(例如<persons>
),或者响应是否应列出多个<person>
元素?
示例:
@XmlElement
private List<Person> persons;
public class Person {
private String name;
private int age;
//...
}
嵌套:
<rsp>
<persons>
<person>
<name />
<age />
</person>
<person>
...
</person>
</persons>
</rsp>
平的:
<rsp>
<person>
<name />
<age />
</person>
<person>
...
</person>
</rsp>
答案 0 :(得分:4)
我会把它包裹起来。因为添加像列表大小
这样的元数据更自然<persons size="42">
<person>
...
</person>
<person>
...
</person>
.
.
.
<persons>
答案 1 :(得分:4)
它很容易将列表包装在像persons
这样的父元素中。这样做有两个原因:
正如@tanyehzheng所指出的,它允许向列表中添加属性,如大小。
使用包装样式,它允许您的响应对象<rsp>
可以扩展,以更清洁的方式包含其他对象。说明天我们希望添加如下数据(这只是一个例子)
<rsp>
<persons>
<person>
<name />
<age />
</person>
<person>
...
</person>
</persons>
<performanceInfo>
<processingTime>122</processingTime>
</performanceInfo>
</rsp>
答案 2 :(得分:2)
当它出现时,我将通过几个众所周知的RESTFUL接口(或至少在您的服务环境中使用的接口)。我会尽量保持一致,这样您的开发人员生态系统就可以直观地了解您设计的API。
从技术角度来看,我怀疑元素的包装可以使解析或应用程序编码更有效。当然,能够为列表本身提供属性(如 tanyehzheng已经说过了。)
就个人而言,我更喜欢包装的XML,但不是出于任何技术原因。在XML编辑器/查看器中,元素可以折叠,因此可以使人类的响应更加简洁。
答案 3 :(得分:1)
XmlElement
注释来自JAXB 2规范,用于将XML表示为Java类/对象图,反之亦然。 JAXB 2绑定规则基本上是基于将XML模式定义映射到Java类。可以通过XML Schema maxOccurs="unbounded"
属性多次出现的元素,或者在其包含类型中大于1的maxOccurs
值默认表示为list属性(元素项的Java.util.List
),或者不太常见,作为具有访问者的索引属性,例如getProp(int index)
Prop
元素名称。
所以我会说除非特定要求另有规定,否则我不使用包装元素来表示您描述的典型用例。但需要注意的是,您希望Java成员名称采用复数形式,而在XML中,您需要单数形式。在您的示例中,您将要避免使用诸如Persons
之类的Java方法签名的XML元素名称List<Person> getPersons()
,并且可以使用@XmlElement(Name = Person)
注释来获取XML而是单数形式的元素。
您的问题背后有更大的讨论:XML,如SGML(XML和HTML的常见超集),是用于表示半结构化数据的 text 格式(最初设计用于取代) HTML,但没有成功)。因此,根据定义,SGML / XML所设计的数据类型并未在Java组件模型中充分表示,以寻求将Java类/对象完全映射到标记元素。相反,DOM表示或对标记元素的顺序访问的另一种表示,其中彼此之间的元素的文档顺序被尊重,可以说是更自然的契合。事实上,JAXB 1具有更复杂的映射规则,可以往返于元素的文档顺序。但事实证明,对于大多数时候使用XML的相对简单的面向数据的用例,这并没有用。因此,JAXB 2旨在更轻松地捕获像您这样的面向数据的用例。