【问题标题】:Retrofit returning null object改造返回空对象
【发布时间】:2014-10-07 19:23:34
【问题描述】:

我有一个像这样的 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、标签,但是当我尝试获取图像时,它们都是空的。

我有一个看起来像这样的声音 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() 时,它都会给我一个空指针。有什么想法吗?

【问题讨论】:

  • 贴出 GsonBuilder 和 RestAdapter 创建代码。

标签: java android json retrofit


【解决方案1】:

@SerializedName 也可以用来解决这个问题。它允许您匹配预期的 JSON 格式,而无需以完全相同的方式声明您的 Class 变量。

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 可以成为您的朋友。

【讨论】:

  • 嘿,谢谢,这很好用。 @njzk2 答案也很有效,但 JSON 格式不同(有些带有下划线,有些带有破折号)。谢谢
  • @user3669188:确实这也有效。我倾向于认为约定优于配置,因此建议您尽量避免在应用中使用各种不同的命名方案,以获得更好的可读性、维护性以及更短的代码
【解决方案2】:

你可能需要这部分:

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

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

【讨论】:

  • 这与接受的答案一样有效,但另一个答案更适合我的情况(请参阅接受答案的评论)。
【解决方案3】:
public class Images {

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

}

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

【讨论】:

  • 不一定,取决于gsonbuilder中的字段命名策略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 2019-06-20
  • 1970-01-01
相关资源
最近更新 更多