改造期望的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(); } });