Ich arbeite an einer Android-App, die Retrofit + OkHttp verwendet, um eine Verbindung zu einer REST-API herzustellen und JSON-Daten zu verwenden. Ich bin ziemlich neu in Retrofit, also lerne ich immer noch, wie es funktioniert, aber bisher war es ziemlich glatt. Ich stieß jedoch auf ein ungewöhnliches Problem.Retrofit: Wie analysiert man ein JSON-Array, das ein Array und ein Objekt kombiniert?
Einer der Endpunkte gibt Daten, die ein bisschen wie folgt aussieht:
{
"success": true,
"data": [
[
{
"field": "value1",
...
},
{
"field": "value2",
...
},
...
],
{
"info": "value",
"info2": "value",
"info3": "value",
}
],
"message": "This is the message."
}
Zum größten Teil ist dies ein ziemlich Standard JSON-Antwort. Wir haben einen "Status" -Wert, eine "Nachricht" und einen "Daten" -Wert, der die wichtigen Daten enthält, die zurückgegeben werden. Es gibt jedoch ein Problem mit der Struktur von "Daten". Wie Sie sehen, ist es ein Array, aber es ist nicht nur ein Array von Objekten. Sein erstes Element ist das Array von Werten und sein zweites Element ist ein Objekt.
Gson mag dies nicht. Wenn ich eine POJO zu analysieren diese in mit Gson erstellen möchten, würde ich erwarten, so etwas zu tun:
public class JsonResponse {
@SerializedName("success")
@Expose
boolean success;
@SerializedName("message")
@Expose
String message;
@SerializedName("data")
@Expose
private ArrayList<MyObject> data = new ArrayList<>();
public ArrayList<MyObject> getData() {
return data;
}
public void setData(ArrayList<MyObject> data) {
this.data = data;
}
}
Wo „MyObject“ ist ein Parcel wie folgt aus:
public class MyObject implements Parcelable {
@SerializedName("field")
@Expose
boolean field;
...
}
Aber das doesn Es funktioniert nicht, weil "Daten" nicht nur ein Array von Objekten sind; Es ist ein Array, das das Array von Objekten und ein anderes Top-Level-Objekt enthält.
Ich kann "Daten" als "Array" definieren, und es scheint die Werte zu analysieren. Aber dann kommen sie als generische LinkedTreeMap-Objekte heraus, so dass ich die Vorteile von Gson's JSON-> POJO-Parsing verliere.
Gibt es eine elegante Möglichkeit, ein gemischtes Array in Retrofit/Gson zu behandeln? Ich bin nicht für die Daten verantwortlich, die von der API kommen, daher denke ich nicht, dass Änderungen eine Option darstellen.
Aha! Ich wusste, dass es dafür eine Lösung geben musste. Vielen Dank; Ich werde es versuchen. –
hinzugefügt auch mehr Code für die Initialisierung – LukeJanyga