Ich habe eine Java-Klasse MyPojo
, die ich von JSON deserialisieren möchte. Ich habe eine spezielle MixIn-Klasse konfiguriert MyPojoDeMixIn
, um mich bei der Deserialisierung zu unterstützen. MyPojo
hat nur int
und String
Instanzvariablen mit richtigen Gettern und Setzern kombiniert. MyPojoDeMixIn
sieht ungefähr so aus:
public abstract class MyPojoDeMixIn {
MyPojoDeMixIn(
@JsonProperty("JsonName1") int prop1,
@JsonProperty("JsonName2") int prop2,
@JsonProperty("JsonName3") String prop3) {}
}
In meinem Testclient mache ich Folgendes, aber es funktioniert natürlich nicht zur Kompilierungszeit, da es einen JsonMappingException
Zusammenhang mit einer Typinkongruenz gibt.
ObjectMapper m = new ObjectMapper();
m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class);
try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); }
catch (Exception e) { System.out.println(e) }
Ich bin mir bewusst, dass ich dieses Problem beheben könnte, indem ich ein "Antwort" -Objekt erstelle, das nur ein Objekt enthält. ArrayList<MyPojo>
Dann müsste ich diese etwas nutzlosen Objekte für jeden einzelnen Typ erstellen, den ich zurückgeben möchte.
Ich habe mir auch JacksonInFiveMinutes online angesehen , hatte aber eine schreckliche Zeit damit, die Dinge zu verstehen Map<A,B>
und zu verstehen, wie sie mit meinem Problem zusammenhängen. Wenn Sie nicht sagen können, bin ich völlig neu in Java und komme aus einem Obj-C-Hintergrund. Sie erwähnen ausdrücklich:
Neben der Bindung an POJOs und "einfache" Typen gibt es eine weitere Variante: die Bindung an generische (typisierte) Container. Dieser Fall erfordert eine spezielle Behandlung aufgrund der sogenannten Typlöschung (die von Java verwendet wird, um Generika auf etwas abwärtskompatible Weise zu implementieren), wodurch verhindert wird, dass Sie etwas wie Collection.class verwenden (das nicht kompiliert wird).
Wenn Sie also Daten in eine Karte binden möchten, müssen Sie Folgendes verwenden:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
Wie kann ich direkt deserialisieren ArrayList
?
Antworten:
Sie können mithilfe des
TypeReference
Wrappers direkt in eine Liste deserialisieren . Eine Beispielmethode:Und wird so verwendet:
TypeReference Javadoc
quelle
TypeReference
Ich verstehe nur nicht, wie das geht. Anweisungen zur Verwendung von Generika finden Sie oben in meiner Bearbeitung.arrayList.toString()
ungefähr a auszudruckenNullPointerException
. Ich vermute, dass dies daran liegen könnte, dass myPOJO
nicht den richtigen Namenskonventionen für seine Eigenschaften entspricht, das heißt, das ganze Problem ist, dass der Webdienst zurückkehrtProp1Member
und mein Objekt hatProp1
. Dies ist der einzige wirkliche Grund, warum ich zunächst Mixins verwende, damit ich die Deklarationen nicht@JsonProperty
in meine reinen Objekte einfügen muss.Eine andere Möglichkeit besteht darin, ein Array als Typ zu verwenden, z.
Auf diese Weise vermeiden Sie den Ärger mit dem Type-Objekt. Wenn Sie wirklich eine Liste benötigen, können Sie das Array jederzeit in eine Liste konvertieren, indem Sie:
IMHO ist dies viel besser lesbar.
Und um es zu einer tatsächlichen Liste zu machen (die geändert werden kann, siehe Einschränkungen von
Arrays.asList()
), gehen Sie einfach wie folgt vor:quelle
TypeFactory
wie in der nächsten Antwort beschrieben zu verwenden: stackoverflow.com/a/42458104/91497 ist die Jackson-Methode, um den Typ anzugeben.Diese Variante sieht einfacher und eleganter aus.
quelle
Ich habe auch das gleiche Problem. Ich habe einen JSON, der in ArrayList konvertiert werden soll.
Konto sieht so aus.
Alle oben genannten Klassen wurden ordnungsgemäß mit Anmerkungen versehen. Ich habe TypeReference> () {} ausprobiert, funktioniert aber nicht.
Es gibt mir Arraylist, aber ArrayList hat eine linkedHashMap, die einige weitere verknüpfte Hashmaps enthält, die Endwerte enthalten.
Mein Code lautet wie folgt:
Ich habe das Problem endlich gelöst. Ich kann die Liste in Json String wie folgt direkt in ArrayList konvertieren:
quelle
Das funktioniert bei mir.
quelle