java.lang.IllegalStateException:预期 BEGIN_ARRAY 但 BEGIN_OBJECT 改造

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT Retrofit

拜托,我有问题。我想获取网络上的所有实体 api(news.api)

但是我在 retrofit 响应时出现执行错误:

错误:java.lang.IllegalStateException:预期 BEGIN_ARRAY 但在第 1 行第 57 列 BEGIN_OBJECT

感谢您的帮助

public interface ApiService {

    @GET("top-headlines")
    Call<ResponseNewsApi> getResponseNewsApi(@Query("sources") String source, @Query("apiKey") String apiKey);

}

public class ResponseNewsApi {

    @SerializedName("status")
    private String status;
    @SerializedName("totalResults")
    private String totalResults;
    @SerializedName("articles")
    private List<Post> articles;
}

public class Post {

    @SerializedName("source")
    private List<String> source;

    @SerializedName("author")
    private String author;

    @SerializedName("title")
    private String title;

    @SerializedName("description")
    private String description;

    @SerializedName("url")
    private String url;

    @SerializedName("urlToImage")
    private String urlToImage;

    @SerializedName("publishedAt")
    private String publishedAt;

    @SerializedName("content")
    private String content;
}

service.getResponseNewsApi(source,apiKey).enqueue(new Callback<ResponseNewsApi>() {
            @Override
            public void onResponse(Call<ResponseNewsApi> call, Response<ResponseNewsApi> response) {
                Log.d(TAG, "onResponse response:: " + response);
                if (response.body() != null) {
                    data.setValue(response.body());
                    Log.d(TAG, "posts total result:: " + response.body().getTotalResults());
                    Log.d(TAG, "posts size:: " + response.body().getArticles().size());
                    Log.d(TAG, "posts title pos 0:: " + response.body().getArticles().get(0).getTitle());
                }
            }

            @Override
            public void onFailure(Call<ResponseNewsApi> call, Throwable t) {
                data.setValue(null);
                Log.e(TAG,"Error get enqueue Retrofit");
                Log.e(TAG,"Error: "+t.getMessage());
            }
        });
        return data;

您遇到此异常是因为您在 Post 中使用 List<String> source class 意味着您希望 source 作为 array 但在 JSON 响应是 Object。所以你必须把它改成 object.

为您的源对象创建一个 class,如下所示。

 public class Source {
    private String id;
    private String name;
 }

现在您必须更改 source 输入 Post class 如下所示

@SerializedName("source")
 //private List<String> source;
 private Source source; // source is an object in your response json