여기 게시하십시오. 이처음 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();
: