2014-03-12 13 views
14

Ich versuche, die Daten von einer Anwendung zu einer anderen über RESTful WS und es funktioniert zu bekommen, aber ich kann diese Daten nicht verwenden, da ich es nicht werfen kann ... WS gibt eine Liste der Objekte wie folgt aus:Wie konvertiert man LinkedHashMap in ein benutzerdefiniertes Java-Objekt?

{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}]} 

bekommen ich es Jackson ObjectMapper verwenden:

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(); 

    } 

danach ich habe 3 Zeilen Code:

System.out.println(list.get(0)); 
System.out.println(list.get(0).getForename()); 
return list; 

Rückkehr, weil diese Rückgabewert der Methode ot übergeben wird ihr Webservice, der korrekte Daten in einem Browser anzeigt. Interessante Sache geschieht mit zwei Drucklinien, ein druckt die Daten vom Anfang der Post ({id: 1 ...}) aber der andere wirft Ausnahme:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xxx.xxx.web.dto.rp.ConsultantDto 

ConsultantDto und SkillDto sind zwei legit Klassen, die Wenn alle Eigenschaften den Daten von WS entsprechen, sind alle Getter/Setter vorhanden. Soweit es mich betrifft, speichert LinkedHashMap Sachen als Schlüssel: Wert-Paare, also sehe ich einfach nicht, woher diese Ausnahme kommt. Wie kann ich das beheben und warum analysiert ObjectMapper den Wert nicht korrekt (was passiert, wenn ich eine einzelne ConsultantDto anstelle einer List erhalte)?

Antwort

30

Sie müssen dies tun:

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

(Von diesem SO answer)

Der Grund, warum Sie haben TypeReference zu verwenden, ist wegen einer unglücklichen Marotte von Java. Wenn Java eine richtige Generika hätte, würde ich wetten, dass Ihre Syntax funktioniert hätte.

+0

@Enno Ist das Gleiche mit einem generischen T-Typ möglich? – Stephane

Verwandte Themen