改造返回null对象

时间:2014-10-07 19:23:34

标签: 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"  
  }  
}

我尝试使用改造来解析JSON并创建界面。我遇到的问题是我的图片网址为空。其他所有工作,我能够检索id,标签,但是当我尝试获取图像时,它们都是空的。

我有一个看起来像这样的声音:

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()时,它都会给我一个空指针。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

你可能需要这个部分:

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

setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)将允许gson自动将蛇案例转换为驼峰案例。

答案 1 :(得分: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可能是你的朋友。

答案 2 :(得分:0)

public class Images {

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

}

键名在模型中应与json中的相同,否则它不会识别它,否则你无法在GsonBuilder创建时定义它。生成相同的getter setter并且你会很高兴去