質問

後述の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にはトップレベルの「ゲーム」エントリが含まれているので、ゲームのインスタンスを直接逆シリアル化することはできません。応答を表すGameのフィールドを持つ別のタイプが必要です。

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);
.

他のヒント

やや同様の動作のもう1つの理由がある:この場合、デバッガは実際にはRetrofitから返された応答のためのフィールドメンバーはありません。

その理由はproguardです。minifyEnabled trueを使用している場合は、POJOを保存するように明示的に言ってください。それはそのようなものになることができます:

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top