2014-10-07 147 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