2015-11-07 169 views
0

我正在使用Retrofit調用服務器並獲得json響應。我得到的錯誤是:Retrofit - 預計BEGIN_OBJECT,但是BEGIN_ARRAY錯誤

Expected BEGIN_OBJECT but was BEGIN_ARRAY 

這是我的代碼

Main method, 


public class MainActivity extends ListActivity { 

    List<Movie> movieList; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final RestAdapter restadapter = new RestAdapter.Builder().setEndpoint("http://api.themoviedb.org").build(); 

     api movieapi = restadapter.create(api.class); 

     movieapi.getData(new Callback<List<Movie>>() { 
      @Override 
      public void success(List<Movie> movies, Response response) { 
       movieList = movies; 

       adapter adapt = new adapter(getApplicationContext(),R.layout.item_file,movieList); 
       //ListView listView = (ListView) findViewById(R.id.list); 
       setListAdapter(adapt); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show(); 
      } 
     }); 


    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

接口(API)

public interface api { 

    @GET("/3/discover/movie?sort_by=popularity.desc&api_key=e2a804764747474747474574817b218e") 
    public void getData(Callback<List<Movie>> response); 

} 

類適配器

public class adapter extends ArrayAdapter<Movie> { 

    String url = "http://image.tmdb.org/t/p/w185"; 
    private Context context; 
    private List<Movie> movieList; 
    public adapter(Context context, int resource, List<Movie> objects) { 
     super(context, resource, objects); 
     this.context = context; 
     this.movieList = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     View view = inflater.inflate(R.layout.item_file,parent,false); 
     Movie movie = movieList.get(position); 
     TextView tv = (TextView) view.findViewById(R.id.name); 
     tv.setText(movie.getTitle()); 
     ImageView img = (ImageView) view.findViewById(R.id.img); 
     Picasso.with(getContext()).load(url+movie.getPoster_path()).into(img); 
     return view; 
    } 
} 

電影類(我在哪裏處理json的getters setters)

package com.wuno.moviesapp.model; 


public class Movie 
{ 
    private String vote_average; 

    private String backdrop_path; 

    private String adult; 

    private String id; 

    private String title; 

    private String original_language; 

    private String overview; 

    private String[] genre_ids; 

    private String original_title; 

    private String release_date; 

    private String vote_count; 

    private String poster_path; 

    private String video; 

    private String popularity; 

    public String getVote_average() 
    { 
     return vote_average; 
    } 

    public void setVote_average (String vote_average) 
    { 
     this.vote_average = vote_average; 
    } 

    public String getBackdrop_path() 
    { 
     return backdrop_path; 
    } 

    public void setBackdrop_path (String backdrop_path) 
    { 
     this.backdrop_path = backdrop_path; 
    } 

    public String getAdult() 
    { 
     return adult; 
    } 

    public void setAdult (String adult) 
    { 
     this.adult = adult; 
    } 

    public String getId() 
    { 
     return id; 
    } 

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

    public String getTitle() 
    { 
     return title; 
    } 

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

    public String getOriginal_language() 
    { 
     return original_language; 
    } 

    public void setOriginal_language (String original_language) 
    { 
     this.original_language = original_language; 
    } 

    public String getOverview() 
    { 
     return overview; 
    } 

    public void setOverview (String overview) 
    { 
     this.overview = overview; 
    } 

    public String[] getGenre_ids() 
    { 
     return genre_ids; 
    } 

    public void setGenre_ids (String[] genre_ids) 
    { 
     this.genre_ids = genre_ids; 
    } 

    public String getOriginal_title() 
    { 
     return original_title; 
    } 

    public void setOriginal_title (String original_title) 
    { 
     this.original_title = original_title; 
    } 

    public String getRelease_date() 
    { 
     return release_date; 
    } 

    public void setRelease_date (String release_date) 
    { 
     this.release_date = release_date; 
    } 

    public String getVote_count() 
    { 
     return vote_count; 
    } 

    public void setVote_count (String vote_count) 
    { 
     this.vote_count = vote_count; 
    } 

    public String getPoster_path() 
    { 
     return poster_path; 
    } 

    public void setPoster_path (String poster_path) 
    { 
     this.poster_path = poster_path; 
    } 

    public String getVideo() 
    { 
     return video; 
    } 

    public void setVideo (String video) 
    { 
     this.video = video; 
    } 

    public String getPopularity() 
    { 
     return popularity; 
    } 

    public void setPopularity (String popularity) 
    { 
     this.popularity = popularity; 
    } 

    @Override 
    public String toString() 
    { 
     return "Movie [vote_average = "+vote_average+", backdrop_path = "+backdrop_path+", adult = "+adult+", id = "+id+", title = "+title+", original_language = "+original_language+", overview = "+overview+", genre_ids = "+genre_ids+", original_title = "+original_title+", release_date = "+release_date+", vote_count = "+vote_count+", poster_path = "+poster_path+", video = "+video+", popularity = "+popularity+"]"; 
    } 
} 
+0

改造嘗試的結果解析到您指定的類型,而這是不返回的類型。您指定的列表是返回對象的成員。 –

+0

@烏迪丹:你不應該把這種談話帶到聊天室嗎?你認爲這真的是一個很好的問題,20條評論? –

+0

我回答了,雖然我現在還沒有安卓工作室,所以可能會出現錯誤。祝你好運 –

回答

0

改裝會嘗試將結果解析爲您指定的類型,但這不是返回的類型。您指定的列表是返回對象的成員。

你應該爲響應創建一個對象:

public class MoviesResponse { 

    private int page; 
    private List<Movie> results; 
    private int total_pages; 
    private int total_results; 

} 

,改變你的回調:

@GET("/3/discover/movie?sort_by=popularity.desc&api_key=your_api_key") 
public void getData(Callback<MoviesResponse> response); 
+0

這將取代我目前的電影課的權利? – wuno

+0

不,列表需要電影類

+0

非常感謝您的幫助,我瞭解您說的基本知識,但是我將無法貫穿始終。你知道如何在網上我可以去閱讀,以解決這個問題與你的答案?例如,當你在界面中的列表中改變類型時,它被稱爲主列表中的列表有錯誤,所以列表只需要被刪除,然後需要在你建議我理解的新類中創建getter和setter。 。 – wuno

相關問題