2014-10-07 196 views
2

我有一個JSON對象,看起來像這樣改造返回null對象

{ 
    id:int, 
    tags: [ 
    "string", 
    "string" 
    ], 
    images: { 
    waveform_l:"url_to_image", 
    waveform_m:"url_to_image", 
    spectral_m:"url_to_image", 
    spectral_l:"url_to_image" 
    } 
} 

我試圖用改裝解析JSON並創建界面。我的問題是,我得到一個空的圖像網址。一切工作,我能夠檢索ID,標籤,但是當我試圖獲得圖像,他們都是空的。

我有一個完善的POJO,看起來像這樣:

public class Sound { 
    private Integer id; 
    private List<String> tags = new ArrayList<String>(); 
    private Images images; 

    public Integer getId() { 
    return id; 
    } 
    public void setId(Integer id) { 
    this.id = id; 
    } 
    public Images getImages() { 
    return images; 
    } 
    public void setImages(Images images) { 
    this.images = images; 
    } 
    ... setters and getter for tags as well 
} 

,我有一個形象的POJO,看起來像這樣:

public class Images { 

    private String waveformL; 
    private String waveformM; 
    private String spectralM; 
    private String spectralL; 

    public String getWaveformL() { 
     return waveformL; 
    } 

    public void setWaveformL(String waveformL) { 
     this.waveformL = waveformL; 
    } 

    public String getWaveformM() { 
     return waveformM; 
    } 

    public void setWaveformM(String waveformM) { 
     this.waveformM = waveformM; 
    } 

    public String getSpectralM() { 
     return spectralM; 
    } 

    public void setSpectralM(String spectralM) { 
     this.spectralM = spectralM; 
    } 

    public String getSpectralL() { 
     return spectralL; 
    } 

    public void setSpectralL(String spectralL) { 
     this.spectralL = spectralL; 
    } 

} 

每當我打電話images.getWaveformM()它給我一個空指針。有任何想法嗎?

+0

發佈GsonBuilder和RestAdapter創建代碼。 – njzk2 2014-10-07 19:26:23

回答

6

@SerializedName也可以用來解決這個問題。它允許您匹配預期的JSON格式,而無需以完全相同的方式聲明您的類變量。

public class Images { 

    @SerializedName("waveform_l") 
    private String waveformL; 
    @SerializedName("waveform_m") 
    private String waveformM; 
    @SerializedName("spectral_m") 
    private String spectralM; 
    @SerializedName("spectral_l") 
    private String spectralL; 

    ... 
} 

如果從JSON到您的類的變量,唯一的區別是蛇/駝峯那麼也許@ njzk2答案的作品更好,但在情況下,有這些邊界之外更多的差異則@SerializeName可以成爲你的朋友。

+0

嘿謝謝,這工作完美。 @ njzk2的答案也很好,但JSON格式不同(有些是下劃線,有些是破折號)。謝謝 – user3669188 2014-10-08 02:52:59

+0

@ user3669188:的確如此。我傾向於認爲約定比配置要好,因此會建議您儘量避免在應用中使用各種不同的命名方案,以獲得更好的可讀性,維護性以及更短的代碼 – njzk2 2014-10-08 15:20:54

0
public class Images { 

    private String waveform_l; 
    private String waveform_m; 
    private String spectral_m; 
    private String spectral_m; 

} 

鍵名應該是模型相同JSON其他明智它不會承認這否則你沒有在GsonBuilder creation.Generate定義它的getter setter方法相同,你會好到哪裏去

+0

不一定取決於gsonbuilder中的字段命名策略。 – njzk2 2014-10-07 19:37:54

+0

添加gsonbuilder代碼也 – 2014-10-07 19:39:13

6

您可能需要這一部分:

Gson gson = new GsonBuilder() 
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 
    .create(); 

setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)將使GSON蛇時,自動轉換成駱駝。

+0

這工作以及接受的答案,但其他答案更符合我的情況(請參閱接受的答案評論)。 – user3669188 2014-10-08 02:56:17