【问题标题】:Retrofit2 Expected BEGIN_ARRAY but was BEGIN_OBJECT Reddit JSON responseRetrofit2 应为 BEGIN_ARRAY 但为 BEGIN_OBJECT Reddit JSON 响应
【发布时间】:2017-07-22 11:53:55
【问题描述】:

在我开始之前,我想为重复这个问题而道歉,但我只是想更好地了解这是如何工作的,因为我环顾四周,但无法找到与我的 JSON 响应相关的答案。

这是我尝试使用 Retrofit2 读取的 JSON 响应。 (https://www.reddit.com/r/popular.json)

{
    kind: "Listing",
    data: {
        modhash: "9nsu2iqwupcf7d47e57c6f70795c9fde52e5566bf8b7731884",
        children: [
            {
                kind: "t3",
                data: {}
            },
            {
                kind: "t3",
                data: {}
            },
            {
                kind: "t3",
                data: {}
            },

            And so on...

我是编程新手,过去曾与 Retrofit 合作过我的几个小项目。在那些项目中,我可以轻松地下载数据,就像我在开始时遇到的 Array 一样,但在这种情况下,它是 Object。

我刚刚使用 POJO 更新了类以创建 JSON 响应结构,但在进入调试模式后它仍然没有返回任何内容。如果您需要任何进一步的信息,请告诉我。非常感谢你们的帮助

public void getPopularPost() {
    popularPosts = new ArrayList<>();

    Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("https://www.reddit.com/")
            .build();

    FromAPI fromAPI = retrofit.create(FromAPI.class);
    final Call<Rootobject> call = fromAPI.getPopularPosts();
    call.enqueue(new Callback<Rootobject>() {
        @Override
        public void onResponse(Call<Rootobject> call, Response<Rootobject> response) {
            response.body();
        }

        @Override
        public void onFailure(Call<Rootobject> call, Throwable t) {

        }
    });
}

================================================ ==============================

public interface FromAPI {

    @GET("r/popular.json")
    Call<Rootobject> getPopularPosts();

}

================================================ ==============================

public class Rootobject {
    private String kind;
    private Data data;
}

public class Data {
    private String modhash;
    private ArrayList<Child> children;
//    private String after;
//    private Object before;    
}

public class Child {   
    private String kind;
    private Data2 data;    
}

public class Data2 {    
    private String domain;
    private String author;
    private String title;
    private int num_comments;
    private int ups;
    private String url;    
}

【问题讨论】:

  • 您的 pojo 类不包含 json 响应的结构。
  • 感谢 Manoj 的回复,但在这种情况下,您能向我解释一下 pojo 结构吗?这就是我想要弄清楚的。我有一个这样的小想法:- ResponseHandle 类与字符串类型和字符串数据,儿童类与字符串 modhash 和 ArrayListchildren
  • json2java.azurewebsites.net 使用此站点从 url 响应生成 pojo 类。这将使您找到解决方案。
  • 你给response.body()打了电话,却什么也没做……你为什么期待那里会发生什么?
  • 在调试模式下,我在 response.body() 上放了一个断点,看它是否包含任何内容,但它跳过了方法,我似乎无法定位问题

标签: java json gson retrofit2


【解决方案1】:

转到此站点Json To Java Pojo 将整个 json 粘贴到那里,它会显示所有需要创建的 pojo 类。您可能缺少一些或创建了一些错误。

【讨论】:

  • 可能是个愚蠢的问题,但我是否需要创建我不想使用但在 Json 中的类?
  • @Nero 不是一个愚蠢的问题,我真的不确定,但据我了解,如果您需要 json 树的最低级别的东西,您需要为每个级别创建 pojo在它上面。
  • @Nero 错误肯定在 json 和 pojo 类中,创建每个类然后尝试肯定会起作用,然后您可以尝试根据您的要求消除类,看看它是否仍然有效
  • @Nero 您是否必须创建所有类才能使其工作?
  • 是的,我认为每节课都是必要的,无论你是否会使用它
猜你喜欢
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 2016-12-27
  • 2013-08-10
  • 2016-08-20
相关资源
最近更新 更多