Ich habe Struktur JSON wie folgt -Nachrüst Gson Konverter für verschachtelte json mit verschiedenen Objekten
{
"status": true,
"message": "Registration Complete.",
"data": {
"user": {
"username": "user88",
"email": "[email protected]",
"created_on": "1426171225",
"last_login": null,
"active": "1",
"first_name": "User",
"last_name": "",
"company": null,
"phone": null,
"sign_up_mode": "GOOGLE_PLUS"
}
}
}
Above Format üblich ist. Nur data
Schlüssel verschiedene Arten von Informationen halten wie user
, product
, invoice
usw.
Ich möchte status
, message
und data
Tasten gleichen in jeder Rest Reaktion halten. data
wird gemäß status
behandelt und message
wird dem Benutzer angezeigt.
Also grundsätzlich ist oben Format in allen Apis gewünscht. Nur Informationen innerhalb data
Schlüssel wird jedes Mal anders sein.
Und ich habe Setup eine folgende Klasse und legen Sie es als Gson Konverter up - MyResponse.java
public class MyResponse<T> implements Serializable{
private boolean status ;
private String message ;
private T data;
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
Deserializer.java
class Deserializer<T> implements JsonDeserializer<T>{
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException{
JsonElement content = je.getAsJsonObject();
// Deserialize it. You use a new instance of Gson to avoid infinite recursion to this deserializer
return new Gson().fromJson(content, type);
}
}
und benutzte es wie folgt -
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
gsonBuilder.registerTypeAdapter(MyResponse.class, new Deserializer<MyResponse>());
...... ..... ....
restBuilder.setConverter(new GsonConverter(gsonBuilder.create()));
Service-Schnittstelle ist wie folgt -
@POST("/register")
public void test1(@Body MeUser meUser, Callback<MyResponse<MeUser>> apiResponseCallback);
@POST("/other")
public void test2(Callback<MyResponse<Product>> apiResponseCallback);
Problem
I status
und message
Felder von innen Rückruf zugreifen können. Aber Informationen innerhalb data
Schlüssel wird nicht geparst und Modell wie MeUser
und Product
immer als leer zurückgegeben.
Wenn ich json Struktur folgende obigen Code ändern funktioniert perfekt -
{
"status": true,
"message": "Registration Complete.",
"data": {
"username": "user88",
"email": "[email protected]",
"created_on": "1426171225",
"last_login": null,
"active": "1",
"first_name": "User",
"last_name": "",
"company": null,
"phone": null,
"sign_up_mode": "GOOGLE_PLUS"
}
}
Wie kann ich es mit Angabe separater Schlüssel in data
Objekt gearbeitet haben und es erfolgreich analysieren?
möchte wissen, was Sie tun –
GSON nicht berücksichtigen die generischen Datentypen 'private T-Daten;' während der Analyse. Es muss ein bestimmter Datentyp sein. –
Verwenden Sie diese Datenklasse anstelle von 'T'.'Klasse Dataclass { \t \t @SerializedName ("user") \t \t Benutzerklasse Benutzer; // Benutzerobjekt \t \t @SerializedName ("Produkt") \t \t ProductClass Produkt; // Produkt Objekt \t \t @ SerializedName ("Rechnung") \t \t InvoiceClass Rechnung; // Rechnung Objekt \t \t Klasse Userclass { \t \t} \t \t Klasse ProductClass { \t \t} \t \t Klasse InvoiceClass { \t \t} \t} ' –