Jackson JSON+;Java泛型

Jackson JSON+;Java泛型,java,json,generics,jackson,deserialization,Java,Json,Generics,Jackson,Deserialization,我正在尝试使用Jackson JSON库将下面的JSON反序列化/映射到列表java对象。(这个json是由jackson生成的,为了简洁起见,我省略了这个片段) 以下是我的转换方法: private static void convert(){ String jsonBill = "{\"bills\":[{\"amount\":\"13\",\"billId\":\"billid3\"}]}"; ObjectMapper mapper = new ObjectMapper()

我正在尝试使用Jackson JSON库将下面的JSON反序列化/映射到
列表java对象。(这个json是由jackson生成的,为了简洁起见,我省略了这个片段)

以下是我的转换方法:

private static void convert(){
   String jsonBill =  "{\"bills\":[{\"amount\":\"13\",\"billId\":\"billid3\"}]}";

   ObjectMapper mapper = new ObjectMapper();
   List<Bill> bills = null;
   try {
       bills = mapper.readValue(jsonBill, new TypeReference<List<Bill>>() { });
   } catch (Exception e) {
       e.printStackTrace();
   }
   System.out.println("bills = " + bills.size());
}
我得到了这个错误:

**org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.List out of START_OBJECT token
 at [Source: java.io.StringReader@7a84e4; line: 1, column: 1]**
 at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:160)
 at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:194)
 at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:103)
 at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:93)
 at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
 at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1980)
 at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1278)
下面是我的简化spring3控制器,它返回i/p json(Jackson映射配置为默认视图):

@modeldattribute(“账单”)
@RequestMapping(value=“/”,method=RequestMethod.GET)
public List fetchBills()引发IOException{
账单=新账单();
账单.设定金额(“13”);
条例草案第3条(“条例草案第3条”);
列表账单=新的ArrayList();
法案。添加(法案);
退票;
}

我想我错过了一些明显的东西。。但不确定是什么。。有什么想法吗?

问题不在于代码,而在于示例输入。实际上,您试图反序列化的是一个具有名为“bills”字段的对象,而不是列表!您应该使用以下内容作为输入:

[{"billId":"billid3","amount":"13"}]

这是一个对象数组,已转换为列表。

尝试使用ObjectWriter而不是ObjectMapper

Writer writer=new StringWriter();

        ObjectWriter oWriter=om.writerWithType(new TypeReference<List<Bill>>() {
        });
        oWriter.writeValue(writer, result);
Writer-Writer=新建StringWriter();
ObjectWriter oWriter=om.writerWithType(新类型引用(){
});
writer.writeValue(writer,result);

我使用的是jackson 1.9.2

您没有告诉它将属性“bills”映射到billLst列表。我从来没有直接这么做过(Spring3.0是自动完成的),但我希望看到一个对“bills”属性的引用。是的,这是我的错别字——更新了我的帖子。谢谢但是问题仍然存在..啊。。谢谢你的指点。我使用的是spring3+Jackson映射器,控制器返回了我使用的json I/p。因此,我需要在客户端将{“bills”:[{“amount”:“13”,“billId”:“billid3”}]转换为[{“billId”:“billid3”,“amount”:“13”}]。我正在寻找一种Jackson包装方法,它可以让我在没有任何自定义代码的情况下完成这项工作。啊,我没有Spring+Jackson的经验,所以我无法提供更多的见解。祝你好运!包装应该很简单:只需创建简单的POJO,如:公共类包装{List bills;},并将'Wrapper.class'作为readValue()方法的类型传递/I希望尽可能避免编写任何自定义代码(如伪包装)。但我现在要活下去。谢谢斯塔克斯曼。
@ModelAttribute("bills")
@RequestMapping(value = "/", method = RequestMethod.GET)
public List<Bill> fetchBills() throws IOException {
    Bill bill = new Bill();
    bill.setAmount("13");
    bill.setBillId("billid3");

    List<Bill> bills = new ArrayList<Bill>();
    bills.add(bill);
    return bills;
}
[{"billId":"billid3","amount":"13"}]
Writer writer=new StringWriter();

        ObjectWriter oWriter=om.writerWithType(new TypeReference<List<Bill>>() {
        });
        oWriter.writeValue(writer, result);