Question

Lorsque j'essaie d'analyser le JSON suivant avec Retrofit, je me retrouve avec des objets membres nuls.

Analyse :

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

Classe de jeu :

@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;
}

Classe d'équipe :

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

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

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

Exemple JSON :

{
   "game":{
      "teamTwo":{
         "array":[]
      },
      "teamOne":{
         "array":[]
      }
   }
}
Était-ce utile?

La solution

Le JSON contient une entrée « jeu » de niveau supérieur, vous ne pouvez donc pas désérialiser directement une instance de jeu.Vous avez besoin d'un autre type qui a un champ de type Game cela représente la réponse.

public class Response {
    public final Game game;

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

Vous pouvez mettre votre JSON dans une chaîne et utiliser Gson directement pour tester comment la réponse sera désérialisée.Ce comportement n'a presque rien à voir avec Retrofit et tout à voir avec le comportement de Gson.

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

Autres conseils

Il peut y avoir une autre raison pour un comportement quelque peu similaire :dans ce cas, le débogueur n'a en réalité aucun membre de champ pour la réponse renvoyée par Retrofit.

Et la raison en est proguard.Si vous utilisez minifyEnabled true, assurez-vous de lui dire explicitement de conserver vos POJO.Cela peut être quelque chose comme ça :

#save model classes
-keep class com.example.app.**.model.** {*; }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top