2014-09-10 2 views
0

여기 게시하십시오. 이처음 GSON을 사용하여 일반 데이터 형식을 비 직렬화

{ 
    "success": true, 
    "message": null, 
    "data": { 
    "id": 1, 
    "name": "1" 
    } 
} 

data 필드가 List<MyModelClass> 수 또는 그냥 그냥 하나의 객체입니다 위의 예에서 MyModelClass 될 수 있었던 것처럼

내 서버에서 JSON 응답 보인다.

json 출력의 필드 이름은 모든 내 POJO 클래스와 정확히 일치합니다.

내 응답 템플릿 getData()에서 해당 데이터를 변환 한 후이

import com.google.gson.annotations.Expose; 

public class ResponseTemplate<T>{ 

    @Expose 
    private boolean success; 
    @Expose 
    private String message; 
    @Expose 
    private T data; 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public boolean isSuccess() { 
     return success; 
    } 

    public void setSuccess(boolean success) { 
     this.success = success; 
    } 

    public T getData() { 
     return this.data; 
    } 

} 

처럼 난 다음이

//.... this is inside a function 

    ResponseTemplate response = apiService.getMyObject(); 
    if (response.isSuccess()) { 
     // if its a list 
     //Type dataType = new TypeToken<List<MyModelClass>>() { 
     //}.getType(); 

     //if a single object 
     String toJson = gson.toJson(response.getData(), MyModelClass.class); 
     System.out.println(toJson); 
     new Gson().fromJson(gson.toJson(response.getData(), MyModelClass.class), MyModelClass.class); 
    } else { 
     return null; 
    } 

을하는 것이 오류

Exception in thread "main" java.lang.IllegalArgumentException: Can not set int field models.MyModelClass.id to com.google.gson.internal.LinkedTreeMap 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55) 
at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56) 
at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36) 
at java.lang.reflect.Field.get(Field.java:379) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:86) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
at com.google.gson.Gson.toJson(Gson.java:593) 
at com.google.gson.Gson.toJson(Gson.java:572) 
at com.google.gson.Gson.toJson(Gson.java:527) 

에게 나에게 줄 것이다했다 이 선 gson.toJson(response.getData(), MyModelClass.class)에 그것은 부서 질 것이다. getData()의 출력이 List<MyModelClass>하지만 getData()의 출력은 MyModelClass 경우가 GSON 모든 필드 이름이 제대로 매핑 된 경우에도, 매핑 할 수없는 경우

이상한 일이

, 그것은 작동합니다.

더 나은 구현 방법이 있습니까? 어쩌면 일반적인 디시리얼라이저일까요? 필자는 검색을 시도하지만 실제로 필요한 것을 찾을 수는 없습니다.

//if its a list 
//Type dataType = new TypeToken<ResponseTemplate<List<MyModelClass>>>() {}.getType(); 

//if its a single object 
Type dataType = new TypeToken<ResponseTemplate<MyModelClass>>() {}.getType(); 
ResponseTemplate response = new Gson().fromJson(gson.toJson(apiService.getMyObject(), dataType), dataType); 

MyModelClass myModelClass = response.getData(); 
:

답변

0

내가이 작업을 수행하여 내 문제를 해결
관련 문제