Json-Jersey 无法解组参数化根列表
Json-Jersey fails to unmarshall parametrized root List
最近我尝试编写通用函数,使用 jesrey-json-1.8 将 json 响应从 API 转换为对象。我发现它确实适用于列表。
可以配置还是 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,或者可能仅适用于我的列表是根元素的情况:
@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 );
没有找到 goo 解决方案,所以我以一种丑陋但有效的方式做到了:
1. 删除 json 字符串开头和结尾的括号
2. 以','分割
3. 传递 (2) 中的数组并进行解组调用
最近我尝试编写通用函数,使用 jesrey-json-1.8 将 json 响应从 API 转换为对象。我发现它确实适用于列表。 可以配置还是 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,或者可能仅适用于我的列表是根元素的情况:
@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 );
没有找到 goo 解决方案,所以我以一种丑陋但有效的方式做到了: 1. 删除 json 字符串开头和结尾的括号 2. 以','分割 3. 传递 (2) 中的数组并进行解组调用