Ich versuche moxy eine json mit der folgenden Struktur zu verwenden unmarshal:JAXB: Abstellungs heterogenes Array
[
{
"page": 1,
"pages": 1
},
[
{
"indicator": {
"id": "IC.BUS.EASE.XQ",
"value": "Ease of doing business index"
},
"country": {
"id": "1A",
"value": "Arab World"
},
"value": "113.952380952381",
"date": "2014"
},
...
]
]
Das erste Element des Arrays ein Objekt ist und das zweite Element ist ein weiteres Array von komplexen Elementen. Ich habe hier wirklich SO und die MOXy-Dokumentation für ein ähnliches Beispiel ohne Erfolg durchsucht.
Mein bester Versuch, das JSON-Dokument zu JAVA-Klassen zuzuordnen, ist wie folgt. Die Wurzelklasse ist CountryDataResponse (Getter & Setter ommited):
@XmlRootElement
@XmlType(propOrder ={"paginationInfo", "dataArray"})
public class CountryDataResponse {
private DataArray dataArray;
private PaginationInfo paginationInfo;
}
(. Ich kann sehen, dies ist zum Scheitern verurteilt, weil es nicht ein Array ist, aber ich bin völlig verloren)
PaginationInfo class modelliert das erste Element des Stammarrays, und die DataArray-Klasse umschließt das zweite Element, das ein Array von Data-Klassenelementen ist. Außerdem habe ich die Indikator- und Länderklassen für die komplexen Typen in jedem Datenelement erstellt.
Die Hauptklassen (Indikator und Land ommited):
@XmlRootElement(name = "paginationInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class PaginationInfo {
private int page;
private int pages;
}
@XmlRootElement(name = "dataArray")
public class DataArray {
List<Data> datas;
}
@XmlRootElement(name="data")
@XmlAccessorType(XmlAccessType.FIELD)
public class Data {
private Indicator indicator;
private Country country;
private String date;
private double value;
}
Nun Debuggen den folgenden Code:
public static void main(String args[]) {
String test = "[{\"page\": 1,\"pages\": 1,\"per_page\": \"1000\",\"total\": 248},"
+ "["
+ "{\"indicator\": {\"id\": \"NY.GDP.MKTP.CD\",\"value\": \"GDP (current US$)\"},"
+ "\"country\": {\"id\": \"1A\",\"value\": \"Arab World\"},"
+ "\"value\": \"2853079422103.94\","
+ "\"decimal\": \"1\","
+ "\"date\": \"2013\"},"
+ "{\"indicator\": {\"id\": \"NY.GDP.MKTP.CD\",\"value\": \"GDP (current US$)\"},"
+ "\"country\": {\"id\": \"S3\",\"value\": \"Caribbean small states\"},"
+ "\"value\": \"67033118185.1864\","
+ "\"decimal\": \"1\","
+ "\"date\": \"2013\"}"
+ "]]";
JAXBContext jc = JAXBContext.newInstance(CountryDataResponse.class, Country.class, Data.class, DataArray.class, Indicator.class, PaginationInfo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);
Object res = unmarshaller.unmarshal(json, CountryDataResponse.class);
}
Das Objekt res (der Klasse JAXBElement) hat einen Wert vom Typ ArrayList. Das erste Element des Arrays ist ein Objekt der Klasse CountryDataResponse (it sollte PaginationInfo sein), die zweite ist eine weitere Array mit Elementen von Klasse CountryDataResponse, auch (sie sollte sein Daten Instanzen).
Kann mir bitte jemand helfen, oder ist es einfach ein missgebildeter JSON und kann nicht automatisch korrekt demarshaliert werden?
Vielen Dank im Voraus.
Vielen Dank für Ihre Antwort. In der Tat ist Ihr erster Vorschlag das Ergebnis einer CountryDataResponse, so wie es jetzt ist, so dass es sehr sinnvoll wäre, sie zu verwenden :) Leider kann ich die Struktur nicht ändern: sie kommt von http://api.worldbank.org/ Länder/Indikatoren/NY.GDP.MKTP.CD? per_page = 1000 & MRV = 1 & format = json. – MrMiyagi
In diesem Fall würde ich einen benutzerdefinierten Serializer für das CountryDataResponse-Objekt erstellen: http://www.baeldung.com/jackson-custom-serialization – robinsio