2014-06-11 4 views
54

저는 JSON 구문 분석에 상당히 익숙합니다. 저는 Square의 Retrofit 라이브러리를 사용 중이며이 문제에 부딪 혔습니다. 여기 개조 예상 BEGIN_OBJECT했지만 BEGIN_ARRAY

[ 
     { 
     "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" 
     } 
] 

내 모델은 다음과 같습니다 :이 JSON의 reponse 구문 분석하려고 해요

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); 

} 

내 성공 방법 : 여기 뭐가 문제 1 행 2 열

에 BEGIN_ARRAY 내 성공 방법에 그것을 사용하는 경우

@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을 던졌습니다하지만했다 ? 이 같은 포맷 한 것처럼

답변

113

지금 당신은 응답을 구문 분석됩니다

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

예외는 루트에서 객체를 기대하고 있지만, 실제 데이터가 실제로 배열입니다 당신이에 알려줍니다. 즉, 형식을 배열로 변경해야합니다.

가장 쉬운 방법은 바로 콜백에서 직접 유형으로 목록을 사용하는 것입니다

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

멋진 대답 아미고 –

+10

을 넣어? –

+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

이것은 Jake Wharton이 게시 한 설명을 뺀 것과 같은 대답으로 보입니다. – 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를 사용, 개조 2에서이 문제를 해결하는 방법이

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

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

왜 이것이 문제를 해결하는지 설명 해주십시오. – sorak