Domanda

Quando provo ad analizzare il seguente JSON con retrofit, finisco con gli oggetti membri NULL.

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
.

Classe di gioco:

@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 di squadra:

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

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

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

Esempio JSON:

{
   "game":{
      "teamTwo":{
         "array":[]
      },
      "teamOne":{
         "array":[]
      }
   }
}
.

È stato utile?

Soluzione

Il JSON contiene una voce "Game" di alto livello in modo da non poter deserializzare direttamente un'istanza di gioco.Hai bisogno di un altro tipo che ha un campo di tipo Game che rappresenta la risposta.

public class Response {
    public final Game game;

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

Puoi mettere il tuo JSON in una stringa e utilizzare Direttamente GSON per testare come sarà deserializzata la risposta.Questo comportamento non ha quasi nulla a che fare con il retrofit e tutto a che fare con il comportamento di GSON.

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

Altri suggerimenti

Ci può essere un altro motivo per un comportamento un po 'simile: in questo caso il debugger non ha effettivamente membri del campo per la risposta restituita da retrofit.


E il motivo per cui è proguard.Se si utilizza minifyEnabled true, assicurati di darlo esplicitamente per mantenere i tuoi pojos.Può essere qualcosa del genere:

#save model classes
-keep class com.example.app.**.model.** {*; }
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top