Pergunta

Quando tento analisar o seguinte JSON com Retrofit, acabo com objetos de membro nulos.

Análise:

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 jogo:

@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 da equipe:

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

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

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

Exemplo JSON:

{
   "game":{
      "teamTwo":{
         "array":[]
      },
      "teamOne":{
         "array":[]
      }
   }
}
Foi útil?

Solução

O JSON contém uma entrada de "jogo" de nível superior, portanto você não pode desserializar diretamente uma instância do jogo.Você precisa de outro tipo que tenha um campo do tipo Game que representa a resposta.

public class Response {
    public final Game game;

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

Você pode colocar seu JSON em uma string e usar o Gson diretamente para testar como a resposta será desserializada.Esse comportamento não tem quase nada a ver com Retrofit e tudo a ver com o comportamento do Gson.

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

Outras dicas

Pode haver mais uma razão para um comportamento semelhante:neste caso, o depurador na verdade não possui membros de campo para a resposta retornada do Retrofit.

E a razão para isso é proguard.Se você estiver usando minifyEnabled true, certifique-se de dizer explicitamente para manter seus POJOs.Pode ser algo assim:

#save model classes
-keep class com.example.app.**.model.** {*; }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top