ich Flexjson verwenden ist derzeit versucht, Zuordnen eines JSON String deserialisieren und es auf das Objektmodell meines Android App kartieren. Die Anwendung ist eine Art Bibliothek mit mehreren Anbietern, die einige Kataloge mit mehr Katalogen und Dokumenten in ihnen haben können. Die json geholt von einem Web-Service, den ich keinen Einfluss haben auf und sieht etwa so aus:eine JSONObject auf eine Liste mit Flexjson in Java/Android
{
"library":{
"vendor":[
{
"id":146,
"title":"Vendor1",
"catalog":[
{
"id":847,
"document":[
{
"id":1628,
"title":"Document",
...
},
{
...
}
],
"title":"Catalog ",
},
{
...
}
]
},
{
...
}
]
}
}
So jeder Anbieter, Katalog, Dokument von einem JSONObject und alle untergeordneten Kataloge und Dokumente sind innerhalb eines JSONArray vertreten ist. Bisher funktioniert alles mit Flexjson in Ordnung und der folgenden Deserialisierung Code:
LibraryResponse response = new JSONDeserializer<LibraryResponse>()
.use(Timestamp.class, new TimestampObjectFactory())
.deserialize(getLocalLibrary(), LibraryResponse.class);
return response.library;
Ich habe eine Bibliothek Objekt, das eine List<Vendor>
hat. Jeder Lieferant hat eine List<Catalog>
und eine List<Document>
.
Leider bindet der Webservice die JSONArrays an einfache JSONObjects, wenn ein Katalog nur ein einziges Dokument enthält oder ein Katalog nur einen Katalog enthält. So ist die json in diesem Fall wie folgt aussieht:
"document":
{
"id":1628,
"title":"Document",
...
}
Jetzt Flexjson weiß nicht, wie deserialisieren und ich am Ende mit einem library.vendorX.getDocument() ein List<HashMap>
anstelle ein List<Document>
zu sein. Eine Idee ist, Flexjson explizit zu erklären, wie man mit solchen Fällen umgeht, aber ich habe keine Ahnung, wo ich damit anfangen soll. Ein anderer Weg könnte darin bestehen, das anfängliche json manuell zu analysieren und solche JSONObjects durch das entsprechende JSONArray zu ersetzen. Aber ich denke, dass es nicht schön ist, dorthin zu gehen, da die Bibliothek ziemlich tief sein kann.
Ich hoffe, Sie können hier eine Anleitung geben.
Danke für Ihre Antwort! Ich denke, ich habe mich nicht klar gemacht, ich bekomme immer eine Liste, aber für den Fall, dass es nur ein Dokument gibt, habe ich keine 'Dokumente' in der Liste, sondern 'HashMaps', also' List' als 'Katalog.document' statt 'Liste '. Die Hash-Map-Objekte enthalten die Daten, die mit dem Dokument verbunden sind. Es kommt mir seltsam vor. Ich denke, ich brauche eine Fabrik, die entscheidet, ob wir bereits ein Dokument haben oder eine HashMap haben. Wenn letzteres würde ich das Dokumentobjekt manuell zuordnen.Meine ersten Versuche scheiterten jedoch. Denken Sie, dass dieser Ansatz möglich ist? –
Ich sehe nicht, wie meine Antwort Ihr Problem nicht beantwortet hat. Ich denke, der Grund, warum Sie eine Liste
Es tut mir leid, ich glaube ich habe dich dort missverstanden. Wie auch immer, wenn ich Code versuche, erhalte ich eine Exception bei 'ParameterizedType ptype = (ParameterizedType) targetType;' 'java.lang.ClassCastException: java.lang.Class kann nicht in java.lang.reflect.ParameterizedType' umgewandelt werden. Noch eine Frage: Wenn ich die Factory für 'library.vendor.values.catalog.values.document' festlege, hat das keine Auswirkungen auf andere Ebenen als' library.vendor.values.document'? Da sogar ein Anbieter Dokumente haben kann ... Wäre es möglich, die Factory anzugeben, die in 'LibraryItem.class' verwendet werden soll, welche die Oberklasse aller anderen ist? –