2010-12-15 5 views
15

Я пытаюсь десериализовать/сопоставлять ниже JSON с List<Bill> объект java с использованием Jackson json library. (Это JSON был сгенерирован Джексоном, Iam опуская эту часть для краткости)Jackson JSON + Java Generics

{"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.StringR[email protected]; 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; 
} 

Я предполагаю, что я что-то очевидное отсутствует .. но не уверен, что это .. Любые идеи ?

+0

Вы не говорите это, чтобы отобразить атрибут «счета» в Список billLst. Я никогда не делал этого напрямую (Spring 3.0 делает это автоматически), но я ожидаю увидеть ссылку на атрибуты «счета». – sioked

+0

Да, это была опечатка с моей стороны - обновил мой пост. Благодарю. Но проблема все еще существует. – Ravi

ответ

20

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

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

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

+0

ahh .. Спасибо за указатель. Я использую Spring3 + Jackson Mapper, а json i/p, который я использовал, был возвращен контроллером. – Ravi

+2

Так что мне нужно конвертировать {"bills": [{"amount": "13", "billId": "billid3"}]} в [{"billId": "billid3", "amount": "13"} ] на моей стороне клиента. Я ищу метод оболочки Джексона, который позволяет мне делать это без какого-либо специального кода. – Ravi

+0

А, у меня нет опыта работы с Spring + Jackson, поэтому я не могу предложить больше понимания. Удачи вам! –

3

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

Writer writer=new StringWriter(); 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^