【发布时间】:2016-03-06 14:00:16
【问题描述】:
最近我尝试编写通用函数,该函数将使用 jesrey-json-1.8 将来自 API 的 json 响应转换为对象。我发现它确实适用于列表。 可以配置还是 jersey-json 不能处理参数化类型?
这行得通:
@XmlRootElement
public static class ListWrapper {
@XmlElement
public List<Advertiser> advertisers;
}
@Test
public void testListFromJson() throws ParseException, JAXBException {
String str = "{\"advertisers\":[{\"advertiser_id\":\"1\",\"name\":\"adidas\",\"owner_id\":\"1\"},{\"advertiser_id\":\"2\",\"name\":\"bdidas\",\"owner_id\":\"2\"}]}";
ListWrapper list = new ListWrapper();
String json = str; //"{\"list\":" + json + "}";
JSONJAXBContext jaxbContext = new JSONJAXBContext( list.getClass() );
JSONUnmarshaller unmarshaller = jaxbContext.createJSONUnmarshaller();
list = unmarshaller.unmarshalFromJSON( new StringReader( json ), list.getClass() );
}
但是,我需要使用参数化列表,因为我有几个 API 调用返回列表:“api/advertisers/all”、“api/permissions/all”、“api/campaigns/all”等,但这并不工作:
@XmlRootElement
public static class ListWrapper<T> {
@XmlElement
public List<T> advertisers;
}
@SuppressWarnings("unchecked")
@Test
public void testListFromJson() throws ParseException, JAXBException {
String str = "{\"advertisers\":[{\"advertiser_id\":\"1\",\"name\":\"adidas\",\"owner_id\":\"1\"},{\"advertiser_id\":\"2\",\"name\":\"bdidas\",\"owner_id\":\"2\"}]}";
ListWrapper<Advertiser> list = new ListWrapper<Advertiser>();
String json = str; //"{\"list\":" + json + "}";
JSONJAXBContext jaxbContext = new JSONJAXBContext( list.getClass(), Advertiser.class );
JSONUnmarshaller unmarshaller = jaxbContext.createJSONUnmarshaller();
list = unmarshaller.unmarshalFromJSON( new StringReader( json ), list.getClass() );
}
对于 XML 提出了几乎类似的问题 (例如Unmarshalling generic list with JAXB),但此解决方案不适用于 jersey-json,或者可能仅适用于 list 是根元素的情况:
@XmlRootElement
public static class ListWrapper<T> {
private List<T> items;
public ListWrapper() {
items = new ArrayList<T>();
}
public ListWrapper(List<T> items) {
this.items = items;
}
@XmlAnyElement(lax=true)
public List<T> getItems() {
return items;
}
}
String json = "{\"items\":[{\"advertiser_id\":\"1\",\"name\":\"adidas\",\"owner_id\":\"1\"},{\"advertiser_id\":\"2\",\"name\":\"bdidas\",\"owner_id\":\"2\"}]}";
JSONJAXBContext context = new JSONJAXBContext(Advertiser.class, ListWrapper.class);
JSONUnmarshaller unmarshaller = context.createJSONUnmarshaller();
ListWrapper<Advertiser> wrapper = (ListWrapper<Advertiser>)unmarshaller.unmarshalFromJSON( new StringReader( json ), ListWrapper.class );
【问题讨论】: