Java – Can not deserialize instance of java.lang.String out of START_ARRAY token

jacksonjava

I am very new to the Jackson parser. My code was running fine until today. I am not able to figure out the error.

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
at [Source:  line: 1, column: 1095] (through reference chain: JsonGen["platforms"])
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:163)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:588)
at com.fasterxml.jackson.databind.deser.std.JdkDeserializers$StringDeserializer.deserialize(JdkDeserializers.java:90)
at com.fasterxml.jackson.databind.deser.std.JdkDeserializers$StringDeserializer.deserialize(JdkDeserializers.java:59)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:336)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:89)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:290)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:112)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:226)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2563)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1789)
at BossMan.candie(BossMan.java:49)
at Hilda.main(Hilda.java:81)

Here is the code for URL calling and object mapper:

public class BossMan {
public String[] candie () throws JsonParseException, JsonMappingException, IOException
  {
    URL jsonUrl = new URL("http://www.dishanywhere.com/radish/v20/dol/home/carousels/shows.json");

    ObjectMapper objmapper = new ObjectMapper();
    List<JsonGen> jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGen>>() {});
        String[] shows = new String [jsongen.size()]; 
        int i = 0;
    for(JsonGen element : jsongen) {
      shows[i++]=element.getName();
    }
    return shows;  
  }
}

Here is the POJO class:

import java.util.List;

public class JsonGen{
  private String _type;
  private List cast;
  private List clips;
  private Common_sense_data common_sense_data;
  private String common_sense_id;
  private List crew;
  private String description;
  private List episodes;
  private Number franchise_id;
  private List genres;
  private String guid;
  private Images images;
  private boolean is_locked;
  private boolean is_mobile;
  private boolean is_parental_locked;
  private String kind;
  private String mobile_networks;
  private String most_recent_full_episode_added_date;
  private String name;
  private List networks;
  private String platforms;
  private List ratings;
  private String release_date;
  private List season_filters;
  private String slug;
  private String tms_id;

  public String get_type(){
    return this._type;
  }
  public void set_type(String _type){
    this._type = _type;
  }
  public List getCast(){
    return this.cast;
  }
  public void setCast(List cast){
    this.cast = cast;
  }
  public List getClips(){
    return this.clips;
  }
  public void setClips(List clips){
    this.clips = clips;
  }
  public Common_sense_data getCommon_sense_data(){
    return this.common_sense_data;
  }
  public void setCommon_sense_data(Common_sense_data common_sense_data){
    this.common_sense_data = common_sense_data;
  }
  public String getCommon_sense_id(){
    return this.common_sense_id;
  }
  public void setCommon_sense_id(String common_sense_id){
    this.common_sense_id = common_sense_id;
  }
  public List getCrew(){
    return this.crew;
  }
  public void setCrew(List crew){
    this.crew = crew;
  }
  public String getDescription(){
    return this.description;
  }
  public void setDescription(String description){
    this.description = description;
  }
  public List getEpisodes(){
    return this.episodes;
  }
  public void setEpisodes(List episodes){
    this.episodes = episodes;
  }
  public Number getFranchise_id(){
    return this.franchise_id;
  }
  public void setFranchise_id(Number franchise_id){
    this.franchise_id = franchise_id;
  }
  public List getGenres(){
    return this.genres;
  }
  public void setGenres(List genres){
    this.genres = genres;
  }
  public String getGuid(){
    return this.guid;
  }
  public void setGuid(String guid){
    this.guid = guid;
  }
  public Images getImages(){
    return this.images;
  }
  public void setImages(Images images){
    this.images = images;
  }
  public boolean getIs_locked(){
    return this.is_locked;
  }
  public void setIs_locked(boolean is_locked){
    this.is_locked = is_locked;
  }
  public boolean getIs_mobile(){
    return this.is_mobile;
  }
  public void setIs_mobile(boolean is_mobile){
    this.is_mobile = is_mobile;
  }
  public boolean getIs_parental_locked(){
    return this.is_parental_locked;
  }
  public void setIs_parental_locked(boolean is_parental_locked){
    this.is_parental_locked = is_parental_locked;
  }
  public String getKind(){
    return this.kind;
  }
  public void setKind(String kind){
    this.kind = kind;
  }
  public String getMobile_networks(){
    return this.mobile_networks;
  }
  public void setMobile_networks(String mobile_networks){
    this.mobile_networks = mobile_networks;
  }
  public String getMost_recent_full_episode_added_date(){
    return this.most_recent_full_episode_added_date;
  }
  public void setMost_recent_full_episode_added_date(String most_recent_full_episode_added_date){
    this.most_recent_full_episode_added_date = most_recent_full_episode_added_date;
  }
  public String getName(){
    return this.name;
  }
  public void setName(String name){
    this.name = name;
  }
  public List getNetworks(){
    return this.networks;
  }
  public void setNetworks(List networks){
    this.networks = networks;
  }
  public String getPlatforms(){
    return this.platforms;
  }
  public void setPlatforms(String platforms){
    this.platforms = platforms;
  }
  public List getRatings(){
    return this.ratings;
  }
  public void setRatings(List ratings){
    this.ratings = ratings;
  }
  public String getRelease_date(){
    return this.release_date;
  }
  public void setRelease_date(String release_date){
    this.release_date = release_date;
  }
  public List getSeason_filters(){
    return this.season_filters;
  }
  public void setSeason_filters(List season_filters){
    this.season_filters = season_filters;
  }
  public String getSlug(){
    return this.slug;
  }
  public void setSlug(String slug){
    this.slug = slug;
  }
  public String getTms_id(){
    return this.tms_id;
  }
  public void setTms_id(String tms_id){
    this.tms_id = tms_id;
  }
}

Here is the main function:

public class Hilda {
public static boolean b ;
public static WebDriver driver;
public static int countingCrows(WebDriver driver) throws InterruptedException{
  int i,j=0,k=0;
  for(i=1; i<=2; i++){
    for(j=1; j<=6; j++){
      if(!(i==1&&j==6)){
        b = driver.findElement(By.xpath("//div[2]/div[5]/div[3]/div/div/div/div[1]/div/div[2]/div[2]/div/div["+i+"]/ul/li["+j+"]/div/a/img")).isEnabled();
        k++;
        //System.out.println("k inner loop:"+k);
      }
      if(i==1&&j==5){
        Thread.sleep(5000);
        try{
          boolean c = driver.findElement(By.xpath("//div[2]/div[5]/div[3]/div/div/div/div[1]/div/div[2]/div[2]/div/div[1]/ul/li[6]/div/a/img")).isEnabled();
          if(c){
            k++;
            //System.err.println("k inside j==5 for sixsth element:"+k);
          }
        }catch (Exception e) {
          System.err.println("sixsth elemnet not found in first row");
        }
      }
    }
    if(i==1&&j==5){
      Thread.sleep(5000);
      driver.findElement(By.xpath("//*[@class='carousel-control left']")).click();
    }
  }
  System.out.println("total no :"+k);
  return k;
}

public static String[] unchained(WebDriver driver) throws InterruptedException{
  Thread.sleep(5000);
  int j = countingCrows(driver);
  int i,k=0;
  String[] singleText1 = new String[11];
  if(j==11){
  for(i=1; i<=2; i++){
    for(j=1; j<=6; j++){
      if(!(i==1&&j==6)){
        singleText1[k] = driver.findElement(By.xpath("//div[2]/div[5]/div[3]/div/div/div/div[1]/div/div[2]/div[2]/div/div["+i+"]/ul/li["+j+"]/div/a/img")).getAttribute("id");
        //boolean b = driver.findElement(By.xpath("//div[2]/div[5]/div[3]/div/div/div/div[1]/div/div[2]/div[2]/div/div["+i+"]/ul/li["+j+"]/div/a/img")).isEnabled();
        //System.out.print(j-1+"-"+singleText1[k]); System.out.println("-"+b);
        k++;
      }else {
        System.err.println("element div[1] div[6] is not present");
      }
    }
    if(j==5){
      Thread.sleep(5000);
      driver.findElement(By.xpath("//*[@class='carousel-control left']")).click();
      }
    }
  }
  return singleText1;
}

public static void main(String[] args) throws InterruptedException, JsonParseException, JsonMappingException, IOException {
  WebDriver driver = new SafariDriver();
  driver.get("http://www.dishanywhere.com");
  Thread.sleep(5000);
  String [] cottonSack =unchained(driver);
  System.out.println("*******************************************************");
  int j = countingCrows(driver);
  /*for(int i= 0;i<=j-1;i++){
    System.out.println(cottonSack[i]);
  }*/

  BossMan calvin = new BossMan();
    String[] dogs = calvin.candie();
    for(int k=0;k<cottonSack.length;k++){
      boolean c = dogs[k].equalsIgnoreCase(cottonSack[k]);
      if(c){
        System.out.println("Comparing json data- " +dogs[k]+" with webpage data- "+cottonSack[k]+" and Result is- "+c);
      }else {
        System.out.println("Comparing json data- " +dogs[k]+" with webpage data- "+cottonSack[k]+" Result- "+c);
      }
    }
  }
}

Best Solution

The error is:

Can not deserialize instance of java.lang.String out of START_ARRAY token at [Source: line: 1, column: 1095] (through reference chain: JsonGen["platforms"])

In JSON, platforms look like this:

"platforms": [
    {
        "platform": "iphone"
    },
    {
        "platform": "ipad"
    },
    {
        "platform": "android_phone"
    },
    {
        "platform": "android_tablet"
    }
]

So try change your pojo to something like this:

private List platforms;

public List getPlatforms(){
    return this.platforms;
}

public void setPlatforms(List platforms){
    this.platforms = platforms;
}

EDIT: you will need change mobile_networks too. Will look like this:

private List mobile_networks;

public List getMobile_networks() {
    return mobile_networks;
}

public void setMobile_networks(List mobile_networks) {
    this.mobile_networks = mobile_networks;
}
Related Question