Pregunta

Cuando intento analizar el siguiente JSON con Retrofit, termino con objetos miembro nulos.

Análisis:

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

Clase de juego:

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

Clase de equipo:

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

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

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

Ejemplo JSON:

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

Solución

El JSON contiene una entrada de "juego" de nivel superior para que no pueda desercializar directamente una instancia de juego.Necesita otro tipo que tenga un campo de tipo Game que represente la respuesta.

public class Response {
    public final Game game;

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

Puede poner su JSON en una cadena y usar GSON directamente para probar cómo se desercializará la respuesta.Este comportamiento no tiene casi nada que ver con la modernización y todo para ver con el comportamiento de GSON.

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

Otros consejos

Puede haber una razón más para un comportamiento algo similar:en este caso, el depurador en realidad no tiene miembros de campo para la respuesta devuelta por Retrofit.

Y la razón de esto es proguard.Si estas usando minifyEnabled true, asegúrese de indicarle explícitamente que conserve sus POJO.Puede ser algo así:

#save model classes
-keep class com.example.app.**.model.** {*; }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top