Java 改进返回空对象
我有一个JSON对象,看起来像这样Java 改进返回空对象,java,android,json,retrofit,Java,Android,Json,Retrofit,我有一个JSON对象,看起来像这样 { 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" } } 我正在尝试使用改型来解析JS
{
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并创建接口。我的问题是,我得到的图像URL为空。其他一切正常,我可以检索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
}
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()时,它都会给我一个空指针。有什么想法吗
public class Images {
private String waveform_l;
private String waveform_m;
private String spectral_m;
private String spectral_m;
}
模型中的键名应与json中的键名相同,否则无法识别它,否则您没有在GsonBuilder创建时定义它。为相同的键名生成getter setter,您就可以开始了您可能需要此部分:
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_,带下划线)
将允许gson自动将蛇壳转换为驼峰壳。@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与您的类变量之间的唯一区别是snake/camel情况,那么@njzk2 answer可能会更好,但如果在这些范围之外存在更多差异,那么
@SerializeName
可以成为您的朋友。发布GsonBuilder并重新适应创建代码。不一定,取决于gsonbuilder中的字段命名策略。嘿,谢谢,这非常有效@njzk2答案也可以,但JSON有不同的格式(一些带有下划线,一些带有破折号)。感谢you@user3669188:这确实也行。我倾向于认为惯例比配置要好,因此建议您在应用程序中尽量避免使用各种不同的命名方案,以便更好的可读性、维护性,以及更短的代码,以及接受的答案,但另一个答案更适合我的情况(请参阅关于已接受答案的评论)。