以下のJSONをList<Bill
> Javaオブジェクトを使用してJackson 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());
}
Billエンティティは以下のとおりです。
@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)
以下は、i/p jsonを返す簡単なspring3コントローラーです(デフォルトのビューとして構成されたJacksonマッピングを使用)。
@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;
}
私は明らかな何かが欠けていると思います..しかし、それが何かはわかりません..何かアイデアはありますか?
問題はコードではなく、入力例にあります。実際に逆シリアル化しようとしているのは、リストではなく「bills」という名前のフィールドを持つオブジェクトです!入力として使用する必要があるのは次のとおりです。
[{"billId":"billid3","amount":"13"}]
これは、リストに変換されるオブジェクトの配列です。
ObjectMapperの代わりにObjectWriterを使用してみてください
Writer writer=new StringWriter();
ObjectWriter oWriter=om.writerWithType(new TypeReference<List<Bill>>() {
});
oWriter.writeValue(writer, result);
ジャクソン1.9.2を使用しています