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) 中的数组并进行解组调用