当我尝试使用 Retrofit 解析以下 JSON 时,我最终得到 null 成员对象。

解析:

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包含顶级“游戏”条目,因此您无法直接将一个游戏实例进行反序列化。您需要另一种类型的类型,该类型具有表示响应的类型生成的字段。

public class Response {
    public final Game game;

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

您可以将您的JSON放入字符串中并直接使用GSON来测试响应如何进行反序列化。这种行为几乎与改造和所有与Gson的行为有关。

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

其他提示

类似的行为可能还有一个原因:在这种情况下,调试器实际上没有用于从 Retrofit 返回的响应的字段成员。

原因是 proguard. 。如果您正在使用 minifyEnabled true, ,请确保明确告诉它保留 POJO。它可以是这样的:

#save model classes
-keep class com.example.app.**.model.** {*; }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top