2014-04-11 49 views
2

當我嘗試使用Retrofit解析下面的JSON時,我最終得到了空成員對象。Retrofit返回空成員對象

解析:

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

Team類:

@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":[] 
     } 
    } 
} 

回答

8

JSON包含頂級「遊戲」條目,因此您無法直接反序列化遊戲實例。您需要另一種類型,其類型爲Game,表示響應。

public class Response { 
    public final Game game; 

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

你可以把你的JSON放在一個字符串中,直接使用Gson來測試響應如何被反序列化。這種行爲幾乎與Retrofit無關,並且與Gson的行爲有關。

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

哦該死!當我從工作回來時接受你的回答,我會試試這個。 – OrhanC1

0

可能還有一個原因有些類似的行爲:在這種情況下,調試器實際上沒有字段成員用於從Retrofit返回的響應。

而原因是proguard。如果您使用minifyEnabled true,請確保您明確告訴它保持您的POJO。它可以是這樣的:

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

謝謝!傑克的回答涵蓋了我的答案,但我希望別人認爲這有用! – OrhanC1