Jackson JSON + Java Generics
-
10-10-2019 - |
Question
Je suis en train de deserialize / carte ci-dessous le JSON List<Bill
> objet java en utilisant Jackson bibliothèque JSON . (Ce json a été généré par Jackson, Iam omettant cette pièce par souci de brièveté)
{"bills":[{"amount":"13","billId":"billid3"}]}
Voici ma méthode de conversion:
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());
}
L'entité est le projet de loi ci-dessous:
@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;
}
}
et je reçois cette erreur:
**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)
Voici mon contrôleur de spring3 simplifié qui renvoie le JSON i / p (avec cartographie Jackson configuré comme vue par défaut):
@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;
}
Je suppose que je me manque quelque chose d'évident .. mais pas sûr de ce qu'il est .. Toutes les idées?
La solution
Le problème ne réside pas dans votre code, mais votre entrée par exemple. Qu'est-ce que vous essayez réellement deserialize est un objet avec un champ nommé « factures », pas une liste! Ce que vous devez utiliser comme entrée est:
[{"billId":"billid3","amount":"13"}]
Ceci est un tableau d'objets, qui est converti en une liste.
Autres conseils
Essayez d'utiliser ObjectWriter au lieu de ObjectMapper
Writer writer=new StringWriter();
ObjectWriter oWriter=om.writerWithType(new TypeReference<List<Bill>>() {
});
oWriter.writeValue(writer, result);
J'utilise jackson 1.9.2