2013-03-17 5 views
2

나는 모든 기본 요청과 동일한 기본 컨테이너를 몇 가지 기본 정보와 함께 반환하는 webservice를 가지고 있습니다.GSON을 사용하여 특정 객체를 사용하여 일반 컨테이너를 비 직렬화

{ 
    "error":false, 
    "message":"Message goes here", 
    "items":[ 
     { 
     "id":1, 
     "name":"Test User 1" 
     }, 
     { 
     "id":2, 
     "name":"Test User 2" 
     } 
    ] 
} 

다른 자원을 요청하는 항목의 목록이 달라집니다 : 내 클라이언트에서

{ 
    "error":false, 
    "message":"Message goes here", 
    "items":[ 
     { 
     "id":3, 
     "artist":"Artist 1", 
     "year":2001 
     }, 
     { 
     "id":4, 
     "artist":"Artist 2", 
     "year":1980 
     } 
    ] 
} 

를 내가 매핑 할 예를 들어, 사용자의 목록을 요청하는 나에게 다음과 같은 응답을 줄 것이다 GSON를 사용하여 자바 객체에 대한 응답 :

public class ArtistRestResponse { 
    private boolean error; 
    private String message = ""; 
    private Artist[] items;  
} 

그러나, 일반 필드를 리팩토링 각 자원에 대한 클래스를 만드는에서 저를 유지하기 위해, 만들 수있는 논리적 인 단계가 될 것입니다 일반적으로 입력 RestResponse<T> 클래스 :

public class RestResponse<T> { 
    private boolean error; 
    private String message = ""; 
    private T[] items;   
} 

문제는 RestResponse<Artist> = new Gson().fromJson(json, RestResponse<Artist>.class);를 사용하는 것은 불가능하다는 것이다. 그런 구조를 사용하는 방법이 있습니까? 아니면 서버 응답을 처리하는 더 좋은 방법이 있습니까?

답변

2

여기서 TypeToken을 사용해야합니다.

final TypeToken<RestResponse<Artist>> token = new TypeToken<RestResponse<Artist>>() {}; 
final Type type = token.getType(); 
final Gson gson = new Gson(); 

final RestResponse<Artist> response = gson.fromJson(json, type); 
관련 문제