Frage

Wenn ich versuche, den folgenden JSON-Code mit Retrofit zu analysieren, erhalte ich am Ende Null-Mitgliedsobjekte.

Parsing:

RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint(CallerInfo.API_URL)
        .setLogLevel(RestAdapter.LogLevel.FULL)
        .build();
InGameInfo igi = restAdapter.create(InGameInfo.class);
Game game = igi.fetchInGameInfo("EUW", "sasquatching");
Log.d("Cancantest", "Game " + game); //Not null
Log.d("Cancantest", "Team one " + game.getTeamOne()); //Null

Spielklasse:

@SerializedName("teamTwo")
@Expose private Team teamTwo;
@SerializedName("teamOne")
@Expose private Team teamOne;

public void setTeamOne(Team teamOne) {
    this.teamOne = teamOne;
}

public void setTeamTwo(Team teamTwo) {
    this.teamTwo = teamTwo;
}

public Team getTeamOne() {
    return teamOne;
}

public Team getTeamTwo() {
    return teamTwo;
}

Teamklasse:

@SerializedName("array")
@Expose private TeamMember[] teamMembers;

public void setTeamMembers(TeamMember[] teamMembers) {
    this.teamMembers = teamMembers;
}

public TeamMember[] getTeamMembers() {
    return teamMembers;
}

Beispiel-JSON:

{
   "game":{
      "teamTwo":{
         "array":[]
      },
      "teamOne":{
         "array":[]
      }
   }
}
War es hilfreich?

Lösung

Der JSON enthält einen „Spiel“-Eintrag der obersten Ebene, sodass Sie eine Spielinstanz nicht direkt deserialisieren können.Sie benötigen einen anderen Typ, der ein Feld vom Typ hat Game das stellt die Antwort dar.

public class Response {
    public final Game game;

    public Response(Game game) {
        this.game = game;
    }
}

Sie können Ihren JSON-Code in einen String einfügen und Gson direkt verwenden, um zu testen, wie die Antwort deserialisiert wird.Dieses Verhalten hat fast nichts mit Retrofit zu tun, sondern ausschließlich mit dem Verhalten von Gson.

String data = "...";
Game game = gson.fromJson(data, Game.class);
Response response = gson.fromJson(data, Response.class);

Andere Tipps

Es kann noch einen weiteren Grund für ein etwas ähnliches Verhalten geben:In diesem Fall verfügt der Debugger tatsächlich über keine Feldmitglieder für die von Retrofit zurückgegebene Antwort.

Und der Grund dafür ist proguard.Wenn Sie verwenden minifyEnabled true, Stellen Sie sicher, dass Sie es ausdrücklich anweisen, Ihre POJOs zu behalten.Es kann so etwas sein:

#save model classes
-keep class com.example.app.**.model.** {*; }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top