当前位置: 首页 > 知识库问答 >
问题:

应为BEGIN_数组,但改装调用后为BEGIN_对象

郑帅
2023-03-14

我知道以前有人问过很多这个问题,但在我的情况下,我找不到解决办法。我请求获得关于POJO(电影)列表的json回复

虽然这是我第一次使用改型,但我在标题中遇到了问题。我正在创建的url是正确的,下面是响应的示例:

{  
   "page":1,
   "total_results":19850,
   "total_pages":993,
   "results":[  
      {  
         "vote_count":855,
         "id":420817,
         "video":false,
         "vote_average":7.2,
         "title":"Aladdin",
         "popularity":445.349,
         "poster_path":"\/3iYQTLGoy7QnjcUYRJy4YrAgGvp.jpg",
         "original_language":"en",
         "original_title":"Aladdin",
         "genre_ids":[  
            12,
            14,
            10749,
            35,
            10751
         ],
         "backdrop_path":"\/v4yVTbbl8dE1UP2dWu5CLyaXOku.jpg",
         "adult":false,
         "overview":"A kindhearted street urchin named Aladdin embarks on a magical adventure after finding a lamp that releases a wisecracking genie while a power-hungry Grand Vizier vies for the same lamp that has the power to make their deepest wishes come true.",
         "release_date":"2019-05-22"
      },
      {  
         "vote_count":5224,
         "id":299537,
         "video":false,
         "vote_average":7.1,
         "title":"Captain Marvel",
         "popularity":399.859,
         "poster_path":"\/AtsgWhDnHTq68L0lLsUrCnM7TjG.jpg",
         "original_language":"en",
         "original_title":"Captain Marvel",
         "genre_ids":[  
            28,
            12,
            878
         ],
         "backdrop_path":"\/w2PMyoyLU22YvrGK3smVM9fW1jj.jpg",
         "adult":false,
         "overview":"The story follows Carol Danvers as she becomes one of the universe’s most powerful heroes when Earth is caught in the middle of a galactic war between two alien races. Set in the 1990s, Captain Marvel is an all-new adventure from a previously unseen period in the history of the Marvel Cinematic Universe.",
         "release_date":"2019-03-06"
      },

这是我的模特

public class Movie implements Parcelable {


@PrimaryKey(autoGenerate = true)
private int id;
private String title;
private String releaseDate;
private String moviePoster;
private String avgVote;
private String plot;
private String movieId;
private String movieGenre;

@Ignore
public Movie(String title, String releaseDate, String moviePoster, String avgVote, String plot, String movieId, String movieGenre) {

    this.title = title;
    this.releaseDate = releaseDate;
    this.moviePoster = moviePoster;
    this.avgVote = avgVote;
    this.plot = plot;
    this.movieId = movieId;
    this.movieGenre = movieGenre;
}


public Movie(int id, String title, String releaseDate, String moviePoster, String avgVote, String plot, String movieId, String movieGenre) {

    this.id = id;
    this.title = title;
    this.releaseDate = releaseDate;
    this.moviePoster = moviePoster;
    this.avgVote = avgVote;
    this.plot = plot;
    this.movieId = movieId;
    this.movieGenre = movieGenre;

}

public String getMovieGenre() {
    return movieGenre;
}

public void setMovieGenre(String movieGenre) {
    this.movieGenre = movieGenre;
}

public int getId() {
    return id;
}

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

public String getTitle() {
    return title;
}

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

public String getReleaseDate() {
    return releaseDate;
}

public void setReleaseDate(String releaseDate) {
    this.releaseDate = releaseDate;
}

public String getMoviePoster() {
    return moviePoster;
}

public void setMoviePoster(String moviePoster) {
    this.moviePoster = moviePoster;
}

public String getAvgVote() {
    return avgVote;
}

public void setAvgVote(String avgVote) {
    this.avgVote = avgVote;
}


public String getPlot() {
    return plot;
}

public void setPlot(String plot) {
    this.plot = plot;
}

public String getMovieId() {
    return movieId;
}

public void setMovieId(String movieId) {
    this.movieId = movieId;
}



protected Movie(Parcel in) {
    title = in.readString();
    releaseDate = in.readString();
    moviePoster = in.readString();
    avgVote = in.readString();
    plot = in.readString();
    movieId = in.readString();
    movieGenre = in.readString();
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(title);
    dest.writeString(releaseDate);
    dest.writeString(moviePoster);
    dest.writeString(avgVote);
    dest.writeString(plot);
    dest.writeString(movieId);
    dest.writeString(movieGenre);
}

@SuppressWarnings("unused")
public static final Parcelable.Creator<Movie> CREATOR = new Parcelable.Creator<Movie>() {
    @Override
    public Movie createFromParcel(Parcel in) {
        return new Movie(in);
    }

    @Override
    public Movie[] newArray(int size) {
        return new Movie[size];
    }
};

}

我的@GET

public interface JsonPlaceHolderApi {

    @GET("popular")
    Call<List<Movie>> getMovies(@Query("api_key") String api_key);
}

我的数据请求类

private static final String LOG_TAG = DataRequest.class.getSimpleName();

    ArrayList<Movie> mMovies = null;
    String jsonResponse = "";

    private DataInterface mListener;

    public DataRequest() {
        super();
    }

    public void  getData(String url)  {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_MOVIE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
        Call<List<Movie>> call = jsonPlaceHolderApi.getMovies(Constants.API_KEY);

        call.enqueue(new Callback<List<Movie>>() {
            @Override
            public void onResponse(Call<List<Movie>> call, Response<List<Movie>> response) {

               if(response!=null && response.body()!=null && mListener!=null){

                   mListener.responseData(response.body());
               }
            }
            @Override
            public void onFailure(Call<List<Movie>> call, Throwable t) {
                Log.d(LOG_TAG, "response code throwable " + t);
            }
        });
    }

    public void setOnDataListener(DataInterface listener) {
        mListener = listener;
    }

    public interface DataInterface {
        void responseData( List<Movie> myResponse );
    }
}

最后,我想在我的主要活动中做些什么

prefSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                userOption = prefSpinner.getSelectedItem().toString();
                Log.d(LOG_TAG, "user option is "+ userOption);
                if (userOption.contentEquals("Most Popular") || userOption.contentEquals("Highest Rated")) {

                    DataRequest dataRequest = new DataRequest();
                    dataRequest.setOnDataListener(new DataRequest.DataInterface() {
                        @Override
                        public void responseData(List<Movie> myResponse) {
                            mMoviesList = myResponse;
                        }
                    });
                            dataRequest.getData(userOption);
                    movieRecycleViewAdapter.swapData(mMoviesList);

                } else if(userOption.contentEquals("Favorites")) {
                    setUpViewModel();
                    movieRecycleViewAdapter.notifyDataSetChanged();
                }
            }

共有1个答案

孟子墨
2023-03-14

请求一个关于POJO(电影)列表的json响应

不,你不是。如果查看JSON输出,它是一个JSON对象,而不是JSON数组。它的results属性中包含一个JSON数组。

你需要:

>

  • 创建一个与JSON对象结构匹配的Java类(其中将包括一个列表)

    将改装更改为返回调用

  •  类似资料:
    • 这个错误又回来了! 我是改装的初学者,我看过这篇文章:改装:预期BEGIN_OBJECT但BEGIN_ARRAY 但是即使我试着让它适应我的模型,我仍然不能让它工作。所以我的错误是: 我得到的是: 解析类的属性: IoTGenericDevice子类的属性: 改装电话: 经理:

    • 当我只收到列表中的一个项目时,就会出现这个错误。我在服务器端REST Web服务中使用Jersey,只有当列表返回一个元素时,以及当它有但当它有多个异常时,它工作得非常完美,我就是这样做的: Jersey为什么不发送包含一个项目的列表?是泽西岛的虫子吗?有没有办法让它始终序列化为数组? 这是web服务返回0元素时的JSON数据: 这是web服务返回1个元素时的JSON数据: 当web服务返回超过1

    • 您好,我是新来的改装库,我有问题解析一些json。我已经研究了Stackoverflow的一些其他解决方案,但我的问题没有太多的运气。我正在尝试一个简单的网络服务。如有任何建议,将不胜感激。。 json文件 请求方法 Employees.java 雇员萨皮。JAVA 我得到的错误是 我理解错误是说数据是一个对象,它应该以数组开头,但我无法计算出来。。谢谢

    • 问题内容: 我是JSON解析的新手,我使用Square的Retrofit库并遇到了这个问题。 我正在尝试解析此JSON响应: 这是我的模型: 我的界面: 我的成功方法: 当我将其用于成功方法时,会引发错误 预期为BEGIN_OBJECT,但在第1行column2处为BEGIN_ARRAY 怎么了 问题答案: 现在,你正在解析响应,就好像它是这样格式化的: 异常告诉你,你期望在根目录有一个对象,但实

    • 嗨,我是改装2.0库的新手,我在解析一些json时遇到了问题。我在Stackoverflow上看了一些其他的解决方案,但我的问题运气不佳。我试图用改装2.0从Android系统调用一个api。但它抛出了预期的错误BEGIN_ARRAY但BEGIN_OBJECT。 我对web api的回应是: 这就是我的模型类: 这是我的界面: 这就是我打电话的方式:

    • 使用改装库来使用一项服务,我为我的界面、模型以及如何使用界面添加了代码。 我不断收到一个GSON抛出的“预期的BEGIN_对象,但是BEGIN_数组” 界面 模范公立班学生{ 我怎么称呼方法