Джексон JSON + Java Generics - PullRequest
       19

Джексон JSON + Java Generics

15 голосов
/ 15 декабря 2010

Я пытаюсь десериализовать / отобразить приведенный ниже JSON на List<Bill> объект java, используя библиотеку Джексона json .(этот json был сгенерирован Джексоном, я для краткости опускаю этот фрагмент)

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

Вот мой метод преобразования:

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());
}

Ниже приведена сущность Билла:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS)
public class Bill { 
   private String amount;
   private String billId;

   public String getBillId() {
       return billId;
   }
   public void setBillId(String billId) {
       this.billId = billId;
   }
   public String getAmount() {
       return amount;
   }
   public void setAmount(String amount) {
       this.amount = amount;
   } 
}

и я получаю эту ошибку:

**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 (с отображением Джексона, настроенным как представление по умолчанию):

@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;
}

Я предполагаю, что упускаю что-то очевидное .. но не уверен, что это .. Есть идеи?

Ответы [ 2 ]

20 голосов
/ 15 декабря 2010

Проблема не в вашем коде, а в вашем примере ввода.То, что вы на самом деле пытаетесь десериализовать, это объект с полем с именем «bills», а не список!То, что вы должны использовать в качестве ввода:

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

Это массив объектов, который преобразуется в список.

3 голосов
/ 14 декабря 2011

Попробуйте использовать ObjectWriter вместо ObjectMapper

Writer writer=new StringWriter();

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

Я использую Джексон 1.9.2

...