Модернизация возвращает объект с нулевыми членами

StackOverflow https://stackoverflow.com//questions/23001765

  •  20-12-2019
  •  | 
  •  

Вопрос

Когда я пытаюсь разобрать следующую JSON с модернизацией, я в конечном итоге с нулевыми элементами объектами.

разбор:

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
.

класс игры:

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

Класс команды:

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

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

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

Пример json:

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

Это было полезно?

Решение

JSON содержит запись верхнего уровня «игра», поэтому вы не можете напрямую десертифицировать экземпляр игры.Вам нужен другой тип, который имеет область типа Game, который представляет собой ответ.

public class Response {
    public final Game game;

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

Вы можете поставить свой JSON в строку и использовать GNON непосредственно для проверки того, как ответ будет десериализирован.Такое поведение практически не имеет ничего общего с модернизацией, и все делать с поведением GSON.

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

Другие советы

Может быть еще одна причина для некоторого подобного поведения: в этом случае отладчик на самом деле не имеет полевых элементов для ответа, возвращаемого из модернизации.

И причина того, что это генеракодицетагкод.Если вы используете proguard, убедитесь, что вы явно скажите это, чтобы сохранить свои Pojos.Это может быть что-то в этом роде:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top