2016-09-11 2 views
0

개조 및 RXAndroid를 통해 안드로이드에서 내 REST API와 상호 작용하기 위해 노력하고 있습니다. 문제가 발생했습니다. 나는 'API/사용자/{ID}/{ID}/클래스를'내에 GET 요청을 보낼 때개조 예상 BEGIN_ARRAY했지만 BEGIN_OBJECT

, 내 API는 같은, 사용자 클래스의리스트로 응답

{ 
    "classes": [ 
    { 
     "assignments": [ 
     { 
      "asstype": 0, 
      "classs_id": 1, 
      "desc": "Read", 
      "due": "9/14/16", 
      "id": 1 
     } 
     ], 
    "badge": 0, 
    "days": "W", 
    "id": 1, 
    "location": "W.Claire Harris Textiles 136A", 
    "name": "STS 1101", 
    "professor": "Stickel", 
    "time": "5:00 - 6:15", 
    "user_id": 1 
}, 
{ 
    "assignments": [], 
    "badge": 1, 
    "days": "TR", 
    "id": 2, 
    "location": "Atrium 201L", 
    "name": "HIST 2111", 
    "professor": "Pierce", 
    "time": "6:30 - 7:45", 
    "user_id": 1 
    } 
] 
} 

내 인터페이스는 다음과 같습니다 :이처럼 내 조각에서 호출

@GET("api/users/{user_id}/classes") 
Ovservable<List<Clazz>> getClasses(@Header("Authorization") String auth, @Path("user_id")int user_id); 

:

내 Class 객체가 게터와 함께 다음과 같습니다
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_classes, container, false); 
    Retrofit retrofit = new Retrofit.Builder() 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .baseUrl(Sched.API_BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    RecyclerView classesRV = (RecyclerView)rootView.findViewById(R.id.classRec); 
    ClassInterface classAPI = retrofit.create(ClassInterface.class); 
    Observable<List<Class>> classes = classAPI.getClasses("Basic " +Base64.encodeToString("[email protected]:nightman_420".getBytes(), Base64.NO_WRAP), 1); 

    classes.subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<List<Class>>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 
        e.printStackTrace(); 
       } 

       @Override 
       public void onNext(List<Class> classes) { 
        classesRV.setAdapter(new ClassRecyclerViewAdapter(classes, getContext())); 
        classesRV.setLayoutManager(new LinearLayoutManager(getContext())); 
       } 
      }); 
    return rootView; 
} 

s와 세터 :

public class Class { 
private int id; 
private String name; 
private int badge; 
private String professor; 
private String location; 
private String days; 
private String time; 
private int user_id; 
private List<Assignment> assignments; 

public Class() { 
} 

은 "클래스"를 참조 GSON 안 : [] 배열을하고 그것에서 개체를 구문 분석? 무엇이 잘못 되었습니까?

+2

글쎄 JSON은 객체가 아니라 배열입니다. 클래스의 배열을 포함하지만 REST 호출의 결과는 배열 자체가 아닙니다. Gson이 클래스 배열을 조사하는 유일한 이유는 JSON을'List '을 포함하는 객체에 매핑하려고하는 경우입니다. – CommonsWare

답변

1

@CommonsWare에서 언급했듯이이 JSON 응답 구조에서는 Clazz의 콜렉션을 유지하거나 (사용자 정의 디시리얼라이저를 작성하기 위해) 중간 클래스가 필요합니다. 이처럼 :

public class ClassHolder { 

    List<Clazz> classes; 

} 

getClasses()의 반환 유형은 따라 Observable<ClassHolder>로 변경합니다.

+0

나는 해결책이 이렇게 될 것이라고 생각했다. 감사! – Plays2

관련 문제