Java 改进返回空对象

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

我有一个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"  
  }  
}
我正在尝试使用改型来解析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:这确实也行。我倾向于认为惯例比配置要好,因此建议您在应用程序中尽量避免使用各种不同的命名方案,以便更好的可读性、维护性,以及更短的代码,以及接受的答案,但另一个答案更适合我的情况(请参阅关于已接受答案的评论)。