jackson deserializer - Collections

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
 
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?
 
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.
 
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.
 
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());
 
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.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben