使用 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);