Модернизация возвращает объект с нулевыми членами
Вопрос
Когда я пытаюсь разобрать следующую 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.** {*; }
.