jackson deserializer - Collections

Diskutiere jackson deserializer - Collections im Allgemeine Java-Themen Bereich.
K

klaus1

Hi, habe eine einfaches Beispiel eines Objektes:
Java:
public class Test implements java.io.Serializable {
    private int number;
    private Collection persons;
}
Nun versuche ich meinen JSON String in das Objekt zu bekommen:
Java:
 ObjectMapper mapper = new ObjectMapper();
 return mapper.readValue( jsonString, new TypeReference< Test >() {
                } );
hier bekomme ich eine Exception ClassCastException / LinkedHashMap. Die Collection wird durch den Mapper auf eine LinkedHashmap anstatt meines gewünschten Person Objects gemappt.
Ich habe leider hier generierte Objekte in einem älteren Umfeld, ohne Typen, daher bin ich angewiesen auf die Objekte und kann nicht etwa den Typ angeben, mit dem der jackson mapper umgehen könnte. (List<Person>)
Wie kann ich Jackson beibringen, hier die Collection auf eine List<Person> zu mappen ? Des weiteren auch in der Person dann weitere Collections mappen..

Danke
 
mrBrown

mrBrown

Wie sieht denn das Json aus?

Eine Liste von irgendwas auf ein einzelnes Objekt Mappen klappt natürlich nicht, und ist vermutlich auch nicht das was du meinst?
 
K

klaus1

wird mein Objekt nicht mit Collection persons, sondern mit List<Person> persons angegeben, so funktioniert alles korrekt. leider ist der Code wie gesagt generiert aus einem Model und ich müsste jetzt dem Jackson beibringen das er persons nicht auf eine LinkedHashMap sondern auf eine List<Person> mappt... und darunter also im Objekt Person dann auch weitere Angaben zu Collections.
 
H

httpdigest

Jackson ermittelt den Typ einer Collection aus Generics-Informationen oder aus Annotationen an dem Feld. Eine andere direkte Möglichkeit (sozusagen eine "side-by-side" Typisierung) zur deklarativen oder API-gestützten Angabe von Typen der zu deserialisierenden Properties gibt es nicht, soweit ich weiß.
Was du machen müsstest, ist, dir quasi DTO-Klasse für die zu deserialisierenden Klassen zu schreiben, welche eben entweder die Typinformationen per Generics oder per Annotations verwenden und aus denen du dann die eigentlichen Klassen instanziieren und befüllen kannst, z.B. mit einem Java POJO/POJO Mapper.
 
X

Xyz1

BTW... mit Gson wär's ohne Werbung machen zu wollen auch möglich:
Java:
Gson gson = new GsonBuilder().create();
ArrayList<HashMap<String, Object>> list = gson.fromJson(new BufferedReader(new FileReader(filenames[0])), new TypeToken<ArrayList<HashMap<String, Object>>>() { }.getType());
 
H

httpdigest

Ich denke mal, das Problem ist, dass versucht wird, ein Test Objekt zu deserialieren, welches eben über eine Instanzvariable eine Liste enthält. Und die Typinferenz von dem Elementtyp dieser Liste geht eben gerade nicht, da Annotations und auch Generics fehlen.
Du kannst halt mit einem TypeToken nicht ausdrücken, dass du einmal ein `Test` Objekt haben willst, welches aber bitteschön in seinem "persons"-Feld eine Liste von `Person` erwartet.
 
Thema: 

jackson deserializer - Collections

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben