【问题标题】:Retrofit 2 throwing error Expected BEGIN_ARRAY but was BEGIN_OBJECT改造 2 抛出错误应为 BEGIN_ARRAY 但为 BEGIN_OBJECT
【发布时间】:2016-04-20 03:12:30
【问题描述】:

您好,我是 Retrofit 2.0 库的新手,我在解析一些 json 时遇到问题。我在 Stackoverflow 上查看了其他一些解决方案,但对我的问题不太满意。我正在尝试使用改造 2.0 从 android 调用 api。但它抛出错误 Expected BEGIN_ARRAY but was BEGIN_OBJECT。

我的 web api 回复是:

{
    "items": [{
        "id": 19,
        "lat": 23.79418,
        "lng": 90.401859,
        "user_id": 1,
        "created_at": null,
        "updated_at": null,
        "user": {
            "id": 1,
            "name": "Tarif",
            "email": "fmt@itc.com",
            "created_at": null,
            "updated_at": null
        }

    }]
}

这就是我的模型类的样子:

    public class UserResponse {
    private List<Items> items;
    public List<Items> getItems() {
        return items;
    }
    private class Items{
        private String id;
        private String lat;
        private String lng;
        private String user_id;
        private String created_at;
        private String updated_at;
        private List<User> user;

        private class User{
            private String id;
            private String name;
            private String email;
            private String created_at;
            private String updated_at;

            public String getId() {
                return id;
            }

            public String getName() {
                return name;
            }

            public String getEmail() {
                return email;
            }

            public String getCreated_at() {
                return created_at;
            }
            public String getUpdated_at() {
                return updated_at;
            }


        }
        public String getId() {
            return id;
        }
        public String getLat() {
            return lat;
        }
        public String getLng() {
            return lng;
        }
        public String getUser_id() {
            return user_id;
        }
        public String getCreated_at() {
            return created_at;
        }
        public String getUpdated_at() {
            return updated_at;
        }
        public List<User> getUser() {
            return user;
        }
    }
}

这是我的界面:

@GET("coordinates")
 Call <UserResponse> getUsers();

这就是我的称呼:

ITCService service = ApiUtils.createService(ITCService.class);
        Call<UserResponse> call= service.getUsers();
        call.enqueue(new Callback<UserResponse>() {
            @Override
            public void onResponse(Call<UserResponse> call, retrofit2.Response<UserResponse> response) {

                if (response.isSuccessful()) {
                    UserResponse res = response.body();
                    Log.e("TAG", res.toString());

                } else {
                    // TODO: toast
                    Toast.makeText(getApplicationContext(),response.message(),Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<UserResponse> call, Throwable t) {
                // TODO: error alert

                Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_SHORT).show();
            }
        });

    }

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    List&lt;User&gt; 应该是 HashMap&lt;String,Object&gt; 而不是列表,因为它是 JSONObject 而不是 JSONArray。由于您在项目本身中定义用户类,只需使用 User 而不是 List。不需要 HashMap .

    【讨论】:

    • 我该如何声明?
    • 关键和价值是什么?
    • 只声明 User 而不是 List
    猜你喜欢
    • 2014-12-03
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2016-06-28
    • 2019-02-06
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多