2015-12-12 1 views
1

Новый для использования okhttp и Gson. Я практикую путем создания представления списка, который будет отображать информацию от Rotten Tomatoes APIЯ получаю сообщение об ошибке, когда пытаюсь получить ответ Obj от Json, используя Gson. FATAL EXCEPTION: OkHttp Dispatcher NumberFormatException: недопустимый двойной: ""

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

к неустранимым: OkHttp грузоотправитель com.google.gson. JsonSyntaxException: java.lang.NumberFormatException: Invalid дважды: ""

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

Вы можете поделиться своим кодом адаптера? – HourGlass

+0

Я добавил код адаптера –

ответ

1

в заявленных классах выше вас есть члены типа int теперь в ответ вы получаете значения для этих членов, как пустая строка "", не допускается, оно должно быть целым числом. что делает исключение, вы либо:

1- тип элемента изменения в строку, и обрабатывать пустую строку как 0 в сеттеры/добытчиками или

2- спросить серверную команду, чтобы отправить правильные данные или

3- используйте custom TypedAdapter в преобразователе Gson обрабатывать целые числа, когда у них есть пустая строка

PS: я знаю образец JSON не содержит пустых строк, а на реальном вызове на службу, вы м У вас есть пустые строки для целочисленных членов.