我使用 MOXy 和 Jersey 来实现 RESTful API,并希望自然地返回 JSON 和 XML 的列表,这意味着 XML 包含整个集合以及集合项的元素标签,而 JSON 包含仅用于收藏的标签。
例如,我想返回带有嵌套的设施和位置列表的“组织”资源。作为 XML:
<organisation>
<id>1</id>
<name>XYZ</name>
<facilities>
<facility>
<id>1</id>
<text>Telephone</text>
</facility>
<facility>
<id>3</id>
<text>Whiteboard</text>
</facility>
</facilities>
<locations>
<location>
<id>1</id>
<kind>REGION</kind>
<name>London</name>
</location>
<location>
<id>2</id>
<kind>REGION</kind>
<name>Manchester</name>
</location>
</locations>
</organisation>
作为 JSON:
{
"id": 1,
"name": "XYZ",
"facilities": [
{
"id": 1,
"text": "Telephone"
},
{
"id": 3,
"text": "Whiteboard"
}
],
"locations": [
{
"id": 1,
"kind": "REGION",
"name": "London"
},
{
"id": 2,
"kind": "REGION",
"name": "Manchester"
}
]
}
不幸的是,我似乎无法获得允许我返回 XML 和 JSON 输出的代码库。如果我使用类来包装嵌套列表,则 XML 显示正确,但 JSON 显示不正确(请参阅下面的“ExternalFacilities”)。如果我将嵌套列表定义为ArrayList
子类,则 JSON 显示正确,但 XML 不正确(请参阅下面的“ExternalLocations”)。
XML 示例显示“设施”列表正确,但“位置”列表不正确
请注意,没有包含“位置”列表的 XML 元素(与“设施”列表一样),并且每个位置都有一个复数元素名称。
<organisation>
<id>1</id>
<name>XYZ</name>
<facilities>
<facility>
<id>1</id>
<text>Telephone</text>
</facility>
<facility>
<id>3</id>
<text>Whiteboard</text>
</facility>
</facilities>
<locations>
<id>1</id>
<kind>REGION</kind>
<name>London</name>
</locations>
<locations>
<id>2</id>
<kind>REGION</kind>
<name>Manchester</name>
</locations>
</organisation>
JSON 示例显示“位置”列表正确,但“设施”列表不正确
请注意,“设施”列表是一个包含 JSON 数组的 JSON 对象,而我只需要 JSON 数组(具有复数元素名称)。
{
"id": 1,
"name": "XYZ",
"facilities": {
"facility": [
{
"id": 1,
"text": "Telephone"
},
{
"id": 3,
"text": "Whiteboard"
}
]
},
"locations": [
{
"id": 1,
"kind": "REGION",
"name": "London"
},
{
"id": 2,
"kind": "REGION",
"name": "Manchester"
}
]
}
上面的示例是使用相同的代码生成的,只是更改 Accept HTTP 标头以使 Jersey 返回 JSON 而不是 XML。以下是课程摘录:
外部组织.java
@XmlRootElement(name="organisation")
@XmlAccessorType(XmlAccessType.FIELD)
public class ExternalOrganisation {
private String name;
private ExternalFacilities facilities;
private ExternalLocations locations;
...
}
外部设施.java
@XmlRootElement(name="facilities")
public class ExternalFacilities {
@XmlElementRef
private List<ExternalFacility> list;
...
}
外部位置.java
@XmlRootElement(name="locations")
public class ExternalLocations extends ArrayList<ExternalLocation> {
...
}
外部设施.java
@XmlRootElement(name="facility")
@XmlType(propOrder={"id", "uri", "kind", "text"})
public class ExternalFacility extends ExternalBase {
// id inherited
private String text;
....
}
外部位置.java
@XmlRootElement(name="location")
@XmlType(propOrder={"id", "kind", "name"})
public class ExternalLocation extends ExternalBase {
// id inherited
@XmlElement private LocationKind kind;
@XmlElement private String name;
...
}
乍一看类似于这个问题但我并不想混合列表中的对象类型。