改造期望的BEGIN_OBJECT,但是BEGIN_ARRAY
我对JSONparsing相当陌生,我正在使用Square的Retrofit库,并遇到了这个问题。
我试图parsing这个JSON响应:
[ { "id": 3, "username": "jezer", "regid": "oiqwueoiwqueoiwqueoiwq", "url": "http:\/\/192.168.63.175:3000\/users\/3.json" }, { "id": 4, "username": "emulator", "regid": "qwoiuewqoiueoiwqueoq", "url": "http:\/\/192.168.63.175:3000\/users\/4.json" }, { "id": 7, "username": "test", "regid": "ksadqowueqiaksj", "url": "http:\/\/192.168.63.175:3000\/users\/7.json" } ]
这是我的模特:
public class Contacts { public List<User> contacts; }
…
public class User { String username; String regid; @Override public String toString(){ return(username); } }
我的界面:
public interface ContactsInterface { @GET("/users.json") void contacts(Callback<Contacts> cb); }
我的成功方法:
@Override public void success(Contacts c, Response r) { List<String> names = new ArrayList<String>(); for (int i = 0; i < c.contacts.size(); i++) { String name = c.contacts.get(i).toString(); Log.d("Names", "" + name); names.add(name); } ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, names); mSentTo.setAdapter(spinnerAdapter); }
当我在成功的方法上使用它时,会抛出错误
期望的BEGIN_OBJECT,但在BEGIN_ARRAY第1行第2列
这里有什么问题?
现在你正在parsing响应,就好像它是这样格式化的:
{ "contacts": [ { .. } ] }
exception告诉你这一点,你期待在根的对象,但真正的数据实际上是一个数组。 这意味着您需要将types更改为数组。
最简单的方法是在callback中使用一个列表作为直接types:
@GET("/users.json") void contacts(Callback<List<User>> cb);
在你的界面中replace
@GET("/users.json") void contacts(Callback<Contacts> cb);
通过这个代码
@GET("/users.json") void contacts(Callback<List<Contacts>> cb);
将其转换成一个列表。
下面是例子:
BenchmarksListModel_v1[] benchmarksListModel = res.getBody().as(BenchmarksListModel_v1[].class);
源代码工作
https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU
public interface ApiInterface { @GET("inbox.json") Call<List<Message>> getInbox(); } call.enqueue(new Callback<List<Message>>() { @Override public void onResponse(Call<List<Message>> call, Response<List<Message>> response) { YourpojoClass.addAll(response.body()); mAdapter.notifyDataSetChanged(); } @Override public void onFailure(Call<List<Message>> call, Throwable t) { Toast.makeText(getApplicationContext(), "Unable to fetch json: " + t.getMessage(), Toast.LENGTH_LONG).show(); } });
- 如何使用拦截器在Retrofit 2.0中添加标题
- 添加标题的所有请求与改造2
- 使用Rxjava Schedulers.newThread()与Schedulers.io()进行改造
- 什么时候应该使用RxJava Observable,并在Android上进行简单的callback?
- 使用Retrofit刷新OAuth令牌,无需修改所有调用
- 不支持的操作:Android,Retrofit,OkHttp。 在OkHttpClient中添加拦截器
- 为什么RxJava经常与改造一起使用?
- 如何获得响应作为string使用改造,而不使用GSON或Android中的任何其他库
- 使用Retrofit 2.0和RxJava获取响应状态代码