android - 当我尝试使用 Gson 从 Json 获取 responseObj 时出现错误。致命异常 : OkHttp Dispatcher NumberFormatException: Invalid double: ""

标签 android gson picasso okhttp

刚开始使用 okhttp 和 Gson。我正在通过创建一个 ListView 来练习,该 ListView 将显示来自 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);

                }
            });

    }
}

这是第 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;
    }
}

最佳答案

在上面声明的类中,您有 int 类型的成员,现在在响应中,您将这些成员的值作为空字符串 "" 获取,这是不允许的,它应该是一个整数。那是异常(exception),您要么:

1- 将成员类型更改为字符串,并在 setters/getters 中将空字符串处理为 0 或

2-要求后端团队发送正确的数据 或

3- 使用 custom TypedAdapter在 Gson 转换器中处理空字符串时的整数

P.S:我知道示例 json 不包含空字符串,但在服务的实际调用中,整数成员可能有空字符串

关于android - 当我尝试使用 Gson 从 Json 获取 responseObj 时出现错误。致命异常 : OkHttp Dispatcher NumberFormatException: Invalid double: "",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34236584/

相关文章:

android - 如何将 device_owner 设置为我的 android 应用程序?

java - 如何测试纬度/经度点是否在 map (不是谷歌地图)内

Android点击按钮时绘制图像

java - 改造预期为 BEGIN_OBJECT,但为 BEGIN_ARRAY

android - picasso 的磁盘缓存是如何工作的?

android - XML 中的 ExpandableListView 定义

java - ProGuard:ClassCastException

java - 用于多个 Maven 模块项目的 proguard

Android Picasso 克隆但无法运行示例项目,未找到 gradle 文件

android - 为 picasso 设置 Cookie