Search code examples
androidgsonpicassookhttp

I get an error when I try to get a responseObj from Json using Gson. FATAL EXCEPTION: OkHttp Dispatcher NumberFormatException: Invalid double: ""


New to using okhttp and Gson. I am practicing by creating a List View that will display information from Rotten Tomatoes API

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import com.google.gson.Gson;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;


import java.io.IOException;


public class MainActivity extends AppCompatActivity {

    ListView listView;
    Response responseObj;
    CustomAdapter adapter;
    String url = "http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json?apikey=9htuhtcb4ymusd73d4z6jxcj";
    Gson gson;
    OkHttpClient client;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.myList);
        client = new OkHttpClient();

        Request request = new Request.Builder().url(url).build();

            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Request request, IOException e) {

                }

                @Override
                public void onResponse(com.squareup.okhttp.Response response) throws IOException {
                    String responseStr = response.body().string();
                    gson = new Gson();
                    **responseObj = gson.fromJson(responseStr,Response.class);**
                    adapter = new CustomAdapter(MainActivity.this, responseObj.getMovies());
                    listView.setAdapter(adapter);

                }
            });

    }
}

This is the Error I get for line 44

FATAL EXCEPTION: OkHttp Dispatcher com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Invalid double: ""

public class Response {



private String link_template;
/**
 * id : 771312089
 * title : The Hunger Games: Mockingjay - Part 2
 * year : 2015
 * mpaa_rating : PG-13
 * runtime : 136
 * critics_consensus :
 * release_dates : {"theater":"2015-11-20"}
 * ratings : {"critics_rating":"Fresh","critics_score":70,"audience_rating":"Upright","audience_score":71}
 * synopsis : The second half of Suzanne Collins' final Hunger Games book is adapted in this Lionsgate production. ~ Jeremy Wheeler, Rovi
 * posters : {"thumbnail":"http://resizing.flixster.com/nim-D7-9jGbUZS5wczNes_PmWyI=/53x81/dkpu1ddg7pbsk.cloudfront.net/movie/11/20/29/11202951_ori.jpg","profile":"http://resizing.flixster.com/nim-D7-9jGbUZS5wczNes_PmWyI=/53x81/dkpu1ddg7pbsk.cloudfront.net/movie/11/20/29/11202951_ori.jpg","detailed":"http://resizing.flixster.com/nim-D7-9jGbUZS5wczNes_PmWyI=/53x81/dkpu1ddg7pbsk.cloudfront.net/movie/11/20/29/11202951_ori.jpg","original":"http://resizing.flixster.com/nim-D7-9jGbUZS5wczNes_PmWyI=/53x81/dkpu1ddg7pbsk.cloudfront.net/movie/11/20/29/11202951_ori.jpg"}
 * abridged_cast : [{"name":"Jennifer Lawrence","id":"770800260","characters":["Katniss Everdeen"]},{"name":"Julianne Moore","id":"162654248","characters":["President Alma Coin"]},{"name":"Gwendoline Christie","id":"771060732","characters":["Commander Lyme"]},{"name":"Josh Hutcherson","id":"162654356","characters":["Peeta Mellark"]},{"name":"Robert Knepper","id":"162707688","characters":["Antonius"]}]
 * links : {"self":"http://api.rottentomatoes.com/api/public/v1.0/movies/771312089.json","alternate":"http://www.rottentomatoes.com/m/the_hunger_games_mockingjay_part_2/","cast":"http://api.rottentomatoes.com/api/public/v1.0/movies/771312089/cast.json","reviews":"http://api.rottentomatoes.com/api/public/v1.0/movies/771312089/reviews.json","similar":"http://api.rottentomatoes.com/api/public/v1.0/movies/771312089/similar.json"}
 */

private List<MoviesEntity> movies;

public void setLinks(LinksEntity links) {
    this.links = links;
}

public void setLink_template(String link_template) {
    this.link_template = link_template;
}

public void setMovies(List<MoviesEntity> movies) {
    this.movies = movies;
}

public LinksEntity getLinks() {
    return links;
}

public String getLink_template() {
    return link_template;
}

public List<MoviesEntity> getMovies() {
    return movies;
}

public static class LinksEntity {
    private String self;
    private String alternate;

    public void setSelf(String self) {
        this.self = self;
    }

    public void setAlternate(String alternate) {
        this.alternate = alternate;
    }

    public String getSelf() {
        return self;
    }

    public String getAlternate() {
        return alternate;
    }
}

public static class MoviesEntity {
    private String id;
    private String title;
    private int year;
    private String mpaa_rating;
    private int runtime;
    private String critics_consensus;
    /**
     * theater : 2015-11-20
     */

    private ReleaseDatesEntity release_dates;
    /**
     * critics_rating : Fresh
     * critics_score : 70
     * audience_rating : Upright
     * audience_score : 71
     */

    private RatingsEntity ratings;
    private String synopsis;
    /**
     * thumbnail : http://resizing.flixster.com/nim-D7-9jGbUZS5wczNes_PmWyI=/53x81/dkpu1ddg7pbsk.cloudfront.net/movie/11/20/29/11202951_ori.jpg
     * profile : http://resizing.flixster.com/nim-D7-9jGbUZS5wczNes_PmWyI=/53x81/dkpu1ddg7pbsk.cloudfront.net/movie/11/20/29/11202951_ori.jpg
     * detailed : http://resizing.flixster.com/nim-D7-9jGbUZS5wczNes_PmWyI=/53x81/dkpu1ddg7pbsk.cloudfront.net/movie/11/20/29/11202951_ori.jpg
     * original : http://resizing.flixster.com/nim-D7-9jGbUZS5wczNes_PmWyI=/53x81/dkpu1ddg7pbsk.cloudfront.net/movie/11/20/29/11202951_ori.jpg
     */

    private PostersEntity posters;
    /**
     * self : http://api.rottentomatoes.com/api/public/v1.0/movies/771312089.json
     * alternate : http://www.rottentomatoes.com/m/the_hunger_games_mockingjay_part_2/
     * cast : http://api.rottentomatoes.com/api/public/v1.0/movies/771312089/cast.json
     * reviews : http://api.rottentomatoes.com/api/public/v1.0/movies/771312089/reviews.json
     * similar : http://api.rottentomatoes.com/api/public/v1.0/movies/771312089/similar.json
     */

    private LinksEntity links;
    /**
     * name : Jennifer Lawrence
     * id : 770800260
     * characters : ["Katniss Everdeen"]
     */

    private List<AbridgedCastEntity> abridged_cast;

    public void setId(String id) {
        this.id = id;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public void setMpaa_rating(String mpaa_rating) {
        this.mpaa_rating = mpaa_rating;
    }

    public void setRuntime(int runtime) {
        this.runtime = runtime;
    }

    public void setCritics_consensus(String critics_consensus) {
        this.critics_consensus = critics_consensus;
    }

    public void setRelease_dates(ReleaseDatesEntity release_dates) {
        this.release_dates = release_dates;
    }

    public void setRatings(RatingsEntity ratings) {
        this.ratings = ratings;
    }

    public void setSynopsis(String synopsis) {
        this.synopsis = synopsis;
    }

    public void setPosters(PostersEntity posters) {
        this.posters = posters;
    }

    public void setLinks(LinksEntity links) {
        this.links = links;
    }

    public void setAbridged_cast(List<AbridgedCastEntity> abridged_cast) {
        this.abridged_cast = abridged_cast;
    }

    public String getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public int getYear() {
        return year;
    }

    public String getMpaa_rating() {
        return mpaa_rating;
    }

    public int getRuntime() {
        return runtime;
    }

    public String getCritics_consensus() {
        return critics_consensus;
    }

    public ReleaseDatesEntity getRelease_dates() {
        return release_dates;
    }

    public RatingsEntity getRatings() {
        return ratings;
    }

    public String getSynopsis() {
        return synopsis;
    }

    public PostersEntity getPosters() {
        return posters;
    }

    public LinksEntity getLinks() {
        return links;
    }

    public List<AbridgedCastEntity> getAbridged_cast() {
        return abridged_cast;
    }

    public static class ReleaseDatesEntity {
        private String theater;

        public void setTheater(String theater) {
            this.theater = theater;
        }

        public String getTheater() {
            return theater;
        }
    }

    public static class RatingsEntity {
        private String critics_rating;
        private int critics_score;
        private String audience_rating;
        private int audience_score;

        public void setCritics_rating(String critics_rating) {
            this.critics_rating = critics_rating;
        }

        public void setCritics_score(int critics_score) {
            this.critics_score = critics_score;
        }

        public void setAudience_rating(String audience_rating) {
            this.audience_rating = audience_rating;
        }

        public void setAudience_score(int audience_score) {
            this.audience_score = audience_score;
        }

        public String getCritics_rating() {
            return critics_rating;
        }

        public int getCritics_score() {
            return critics_score;
        }

        public String getAudience_rating() {
            return audience_rating;
        }

        public int getAudience_score() {
            return audience_score;
        }
    }

    public static class PostersEntity {
        private String thumbnail;
        private String profile;
        private String detailed;
        private String original;

        public void setThumbnail(String thumbnail) {
            this.thumbnail = thumbnail;
        }

        public void setProfile(String profile) {
            this.profile = profile;
        }

        public void setDetailed(String detailed) {
            this.detailed = detailed;
        }

        public void setOriginal(String original) {
            this.original = original;
        }

        public String getThumbnail() {
            return thumbnail;
        }

        public String getProfile() {
            return profile;
        }

        public String getDetailed() {
            return detailed;
        }

        public String getOriginal() {
            return original;
        }
    }

    public static class LinksEntity {
        private String self;
        private String alternate;
        private String cast;
        private String reviews;
        private String similar;

        public void setSelf(String self) {
            this.self = self;
        }

        public void setAlternate(String alternate) {
            this.alternate = alternate;
        }

        public void setCast(String cast) {
            this.cast = cast;
        }

        public void setReviews(String reviews) {
            this.reviews = reviews;
        }

        public void setSimilar(String similar) {
            this.similar = similar;
        }

        public String getSelf() {
            return self;
        }

        public String getAlternate() {
            return alternate;
        }

        public String getCast() {
            return cast;
        }

        public String getReviews() {
            return reviews;
        }

        public String getSimilar() {
            return similar;
        }
    }

    public static class AbridgedCastEntity {
        private String name;
        private String id;
        private List<String> characters;

        public void setName(String name) {
            this.name = name;
        }

        public void setId(String id) {
            this.id = id;
        }

        public void setCharacters(List<String> characters) {
            this.characters = characters;
        }

        public String getName() {
            return name;
        }

        public String getId() {
            return id;
        }

        public List<String> getCharacters() {
            return characters;
        }
    }
}

}

 package com.example.nano1.gsonexample;

   import android.content.Context;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.ViewGroup;
   import android.widget.BaseAdapter;
   import android.widget.ImageView;
   import android.widget.TextView;

   import com.squareup.picasso.Picasso;

   import java.util.List;

public class CustomAdapter extends BaseAdapter {

    private List<Response.MoviesEntity> mMovieItem;
    private Context context;
    private LayoutInflater inflater;

    public CustomAdapter(Context context, List<Response.MoviesEntity> mMovieItem) {
        this.context = context;
        this.mMovieItem = mMovieItem;
    }

    @Override
    public int getCount() {
        return mMovieItem.size();
    }

    @Override
    public Object getItem(int position) {
        return mMovieItem.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.each_list_item, parent, false);

        Response.MoviesEntity item = (Response.MoviesEntity) getItem(position);
        ImageView thumbnail = (ImageView) rowView.findViewById(R.id.thumnnail);
        TextView title = (TextView) rowView.findViewById(R.id.title);
        TextView rating = (TextView) rowView.findViewById(R.id.rating);
        String imageURL = item.getPosters().getOriginal();
        Picasso.with(context).load(imageURL).into(thumbnail);
        title.setText(item.getTitle());
        rating.setText(item.getRatings().getAudience_rating());


        return rowView;
    }
}

Solution

  • in the declared classes above you have members of type int now in the response you are getting values for these members as empty string "" which is not allowed, it should be an integer. that makes the exception, you either:

    1- change member type to String, and handle empty string as 0 in the setters/getters or

    2- ask the back-end team to send correct data or

    3- use a custom TypedAdapter in the Gson converter to handle integers when they have empty string

    P.S: i am aware the sample json does not contain empty strings but on the real call on the service, you might have an empty strings for integer members