【问题标题】:Json-Jersey fails to unmarshall parametrized root ListJson-Jersey 无法解组参数化根列表
【发布时间】: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 );

【问题讨论】:

标签: java json list jersey


【解决方案1】:

没有找到好的解决方案,所以我以一种丑陋但有效的方式做到了: 1.去除json字符串开头和结尾的括号 2.用','分割 3. 传递(2)中的数组并进行解组调用

【讨论】:

    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多