2014-06-11 224 views
54

我對JSON解析相當陌生,我使用Square的Retrofit庫並且遇到了這個問題。改造期望的BEGIN_OBJECT,但是BEGIN_ARRAY

我試圖解析此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

什麼是錯在這裏?

回答

113

現在你正在解析響應,如果它是格式如下:

{ 
    "contacts": [ 
    { .. } 
    ] 
} 

例外告訴你這一點,你是在根期待的對象,但真正的數據實際上是一個數組。這意味着您需要將類型更改爲數組。

最簡單的方法是隻使用列表作爲回調的直接類型:

@GET("/users.json") 
void contacts(Callback<List<User>> cb); 
+3

尼斯回答AMIGO –

+10

如何改造2解決這個問題? –

+1

@AzlanJamal同樣的方式 –

1

轉換成一個列表。

下面是例子:

BenchmarksListModel_v1[] benchmarksListModel = res.getBody().as(BenchmarksListModel_v1[].class); 
5

在你的界面 更換

@GET("/users.json") 
void contacts(Callback<Contacts> cb); 

通過這個代碼

@GET("/users.json") 
void contacts(Callback<List<Contacts>> cb); 
+0

這似乎是相同的答案減去由傑克沃頓發佈的描述。 – Peter

+0

這是真的,我有同樣的錯誤,並在修改pojo之前,我決定創建一個arrayList,並得到相同的結果 –

1

源代碼工作

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(); 
      } 
     }); 
0

使用MPV,在解串器,把這個

JsonObject obj = new JsonObject(); 
obj.add("data", json); 

YourResponse response = gson.fromJson(obj.toString(), YourResponse.class); 
JsonArray data = obj.getAsJsonObject().getAsJsonArray("data"); 
+0

請提供解釋爲什麼這解決了問題 – sorak

相關問題