使用 JAX-RS 和 JAXB 将 JSON 响应映射到对象
Mapping JSON Response into Object with JAX-RS and JAXB
我正在尝试将从远程服务获得的响应映射到一个对象中。对于我使用 JAX-RS 注释接口的客户端:
@GET
@Path("/content/example.data")
@Produces(MediaType.APPLICATION_JSON)
@Cacheable("my-data")
Items getInfo(
@PathParam("country") String country,
@PathParam("language") String language);
响应以这种格式出现,作为 JSON 对象列表:
[
{
"code": "01",
"name": "Item1",
"description": "Description for item1",
"show": true
},
{
"code": "02",
"name": "Item2",
"description": "Description for item2",
"show": true
}
]
我要映射的 class 是:
@XmlRootElement
public class Items {
@XmlElementWrapper
List<Item> items;
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
}
@XmlRootElement
public class Item {
@XmlElement(name = "code")
private String code;
@XmlElement(name = "name")
private String name;
@XmlElement(name = "description")
private String description;
@XmlElement(name = "show")
private Boolean show;
public Item(){
}
//...getters/setters
}
它总是 returns 一个项目列表为空的 Items 实例。有什么想法吗?
更新
将其更改为:
List<Item> getInfo(
@PathParam("country") String country,
@PathParam("language") String language);
returns ArrayList<ElementNSImpl>
我可以通过在节点中导航来查看属性。但它不会将其映射到项目 class.
我将响应更改为仅是一个对象而不是服务器上的数组,并将接口更改为:
Item getInfo(
@PathParam("country") String country,
@PathParam("language") String language);
它完美地映射了对象,所以问题一定是在列表中映射对象时出现的。
Server returns Item 对象数组。不是具有 "items" 字段的 Items 对象。您已经设置了您的转换,就好像您收到了这个:
{
"items": [
{
...
},
{
...
}
]
}
这是一个带有 items
字段的对象。注意,{}
括号表示一个对象,[]
表示一个数组。
但你得到这个 - 只是一个数组:
[
{
...
},
{
...
}
]
所以你需要先将其转换为List<Item>
或数组Item[]
(取决于你的框架支持的转换),然后手动将此列表设置为Items
实例.
问题是转换框架无法理解您希望该数组位于 items
字段中(想想 Items
中有两个不同列表字段的情况 class - 它应该选择转换成哪个?)。
收到列表或数组后,手动将其设置为Items.items
。
// List<Item> itemsList - received and converted automatically.
Items items = new Items();
items.setItems(itemsList);
我正在尝试将从远程服务获得的响应映射到一个对象中。对于我使用 JAX-RS 注释接口的客户端:
@GET
@Path("/content/example.data")
@Produces(MediaType.APPLICATION_JSON)
@Cacheable("my-data")
Items getInfo(
@PathParam("country") String country,
@PathParam("language") String language);
响应以这种格式出现,作为 JSON 对象列表:
[
{
"code": "01",
"name": "Item1",
"description": "Description for item1",
"show": true
},
{
"code": "02",
"name": "Item2",
"description": "Description for item2",
"show": true
}
]
我要映射的 class 是:
@XmlRootElement
public class Items {
@XmlElementWrapper
List<Item> items;
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
}
@XmlRootElement
public class Item {
@XmlElement(name = "code")
private String code;
@XmlElement(name = "name")
private String name;
@XmlElement(name = "description")
private String description;
@XmlElement(name = "show")
private Boolean show;
public Item(){
}
//...getters/setters
}
它总是 returns 一个项目列表为空的 Items 实例。有什么想法吗?
更新
将其更改为:
List<Item> getInfo(
@PathParam("country") String country,
@PathParam("language") String language);
returns ArrayList<ElementNSImpl>
我可以通过在节点中导航来查看属性。但它不会将其映射到项目 class.
我将响应更改为仅是一个对象而不是服务器上的数组,并将接口更改为:
Item getInfo(
@PathParam("country") String country,
@PathParam("language") String language);
它完美地映射了对象,所以问题一定是在列表中映射对象时出现的。
Server returns Item 对象数组。不是具有 "items" 字段的 Items 对象。您已经设置了您的转换,就好像您收到了这个:
{
"items": [
{
...
},
{
...
}
]
}
这是一个带有 items
字段的对象。注意,{}
括号表示一个对象,[]
表示一个数组。
但你得到这个 - 只是一个数组:
[
{
...
},
{
...
}
]
所以你需要先将其转换为List<Item>
或数组Item[]
(取决于你的框架支持的转换),然后手动将此列表设置为Items
实例.
问题是转换框架无法理解您希望该数组位于 items
字段中(想想 Items
中有两个不同列表字段的情况 class - 它应该选择转换成哪个?)。
收到列表或数组后,手动将其设置为Items.items
。
// List<Item> itemsList - received and converted automatically.
Items items = new Items();
items.setItems(itemsList);