RESTful WSを使用して、あるアプリから別のアプリにデータを取得しようとしていますが、キャストできず、このデータを使用できません... WSは次のようなオブジェクトのリストを返します。
{id=1, forename=John, surname=Bloggs, username=jbloggs, role=Graduate Developer, office=London, skills=[{technology=Java, experience=2.5}, {technology=Web, experience=2.0}, {technology=iOS, experience=0.0}, {technology=.NET, experience=0.0}]}
取得するには、ジャクソンのObjectMapperを使用します。
ObjectMapper mapper = new ObjectMapper();
List<ConsultantDto> list = new ArrayList<ConsultantDto>();
try {
list = mapper.readValue(con.getInputStream(), ArrayList.class);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
その後、3行のコードがあります。
System.out.println(list.get(0));
System.out.println(list.get(0).getForename());
return list;
このメソッドの戻り値は、ブラウザに正しいデータを表示する他のWebサービスに渡されるためです。 2行の印刷で興味深いことが起こります。1行はこの投稿の先頭({id:1 ...})からデータを印刷しますが、もう1行は例外をスローします。
Java.lang.ClassCastException: Java.util.LinkedHashMap cannot be cast to com.xxx.xxx.web.dto.rp.ConsultantDto
ConsultantDtoとSkillDtoは、WSからのデータに一致するようにすべてのプロパティが設定された2つの正当なクラスであり、すべてのゲッター/セッターが配置されています。私に関する限り、LinkedHashMapはキーと値のペアとしてデータを保存するため、この例外がどこから発生するのかわかりません。どうすれば修正できますか?また、ObjectMapperが値を正しく解析しないのはなぜですか(リストではなく単一のConsultantDtoを取得した場合に)
これを行う必要があります:
List<ConsultantDto> myObjects =
mapper.readValue(jsonInput, new TypeReference<List<ConsultantDto>>(){});
(これから SO回答 )
TypeReference
を使用しなければならない理由は、Javaの不幸な癖によるものです。 Javaに適切なジェネリックがあれば、あなたの構文は機能していたに違いない。
インポート:
import com.fasterxml.jackson.databind.ObjectMapper;
オブジェクト:
private ObjectMapper mapper = new ObjectMapper();
例:
PremierDriverInfoVariationDTO premierDriverInfoDTO =
mapper.convertValue(json, PremierDriverInfoVariationDTO.class);
log.debug("premierDriverInfoDTO : {}", premierDriverInfoDTO);
または
Map<String, Boolean> map = mapper.convertValue(json, Map.class);
log.debug("result : {}", map);
assertFalse(map.get("eligiblePDJob"));