Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrofit returning null object

I have a JSON object that looks like this

{  
  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"  
  }  
}

I'm trying to use retrofit to parse the JSON and create the interface. The problem that I have is that I get a null for the images urls. Everything else works, I am able to retrieve the id, the tags, but when I try to get the images they are all null.

I have a sound pojo that looks like this:

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
}

and I have a Images pojo that looks like this:

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;
  }

}

Whenever I try to call images.getWaveformM() it gives me a null pointer. Any ideas?

like image 242
user3669188 Avatar asked Jul 15 '26 07:07

user3669188


2 Answers

@SerializedName can also be used to solve this. It allows you to match the expected JSON format without having to declare your Class variable exactly the same way.

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;

  ...
}

If the only differences from the JSON to your class variables are the snake/camel case then perhaps @njzk2 answer works better but in cases where there's more differences outside those bounds then @SerializeName can be your friend.

like image 196
Miguel Avatar answered Jul 17 '26 21:07

Miguel


You possibly need this part:

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

setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) will allow gson to automatically transform the snake case into camel case.

like image 29
njzk2 Avatar answered Jul 17 '26 21:07

njzk2