web-dev-qa-db-ja.com

LinkedHashMapをカスタムに変換する方法Javaオブジェクト?

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を取得した場合に)

21
Lucas

これを行う必要があります:

List<ConsultantDto> myObjects =
    mapper.readValue(jsonInput, new TypeReference<List<ConsultantDto>>(){});

(これから SO回答

TypeReferenceを使用しなければならない理由は、Javaの不幸な癖によるものです。 Javaに適切なジェネリックがあれば、あなたの構文は機能していたに違いない。

41
Enno Shioji

インポート:

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"));
1
Donald Choi