如何从 Java 中的泛型类型反序列化 JSON 对象?
How to deserialize JSON object from generic type in Java?
我正在尝试将 JSON 响应映射如下:
{
object: {
id: 1
name: "my name"
email: "username@mail.com"
username: "username"
password: "password"
mobile: "##########"
fbAccessToken: "----------"
img: null
}
errorMessage: ""
successMessage: ""
technicalErrorMessage: ""
error: false
}
所以我写了这个方法:
private <T> ResponseEntity<T> processedRequest(HttpRequestBase requestBase, Class<T> tClass) throws IOException {
HttpResponse response = httpClient.execute(requestBase);
HttpEntity entity = response.getEntity();
Reader reader = new InputStreamReader(entity.getContent());
Type type = new TypeToken<ResponseEntity<T>>() {}.getType();
ResponseEntity<T> responseEntity = gson.fromJson(reader, type);
return responseEntity;
}
基于ResponseEntity
class:
public class ResponseEntity<T> {
private T object;
private boolean isError;
private String errorMessage;
private String successMessage;
private String technicalErrorMessage;
public ResponseEntity() {
setSuccessMessage("");
setError(false);
setErrorMessage("");
setTechnicalErrorMessage("");
}
public T getObject() {
return object;
}
public void setObject(T object) {
this.object = object;
}
public boolean isError() {
return isError;
}
public void setError(boolean error) {
this.isError = error;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public String getTechnicalErrorMessage() {
return technicalErrorMessage;
}
public void setTechnicalErrorMessage(String technicalErrorMessage) {
this.technicalErrorMessage = technicalErrorMessage;
}
public String getSuccessMessage() {
return successMessage;
}
public void setSuccessMessage(String successMessage) {
this.successMessage = successMessage;
}}
但我得到的结果是 ResponseEntity<LinkedTreeMap>
,对象是 (Key->Value
) 的映射,而不是类型 ResponseEntity<T>
.
发送的实际映射对象
下图是在调试器中出现的:
GSON 应该如何理解,它应该使用哪个 class 代替 T
以及 "actual mapped object that send by the Type" 是什么来填充它的字段?我们在 Java 中有 type erasure 泛型,所以在运行时无法理解它 T
是什么。没办法,所以gson就用generic Map<String, String>()
.
看看这个question的回复,都是一样的情况。
我正在尝试将 JSON 响应映射如下:
{
object: {
id: 1
name: "my name"
email: "username@mail.com"
username: "username"
password: "password"
mobile: "##########"
fbAccessToken: "----------"
img: null
}
errorMessage: ""
successMessage: ""
technicalErrorMessage: ""
error: false
}
所以我写了这个方法:
private <T> ResponseEntity<T> processedRequest(HttpRequestBase requestBase, Class<T> tClass) throws IOException {
HttpResponse response = httpClient.execute(requestBase);
HttpEntity entity = response.getEntity();
Reader reader = new InputStreamReader(entity.getContent());
Type type = new TypeToken<ResponseEntity<T>>() {}.getType();
ResponseEntity<T> responseEntity = gson.fromJson(reader, type);
return responseEntity;
}
基于ResponseEntity
class:
public class ResponseEntity<T> {
private T object;
private boolean isError;
private String errorMessage;
private String successMessage;
private String technicalErrorMessage;
public ResponseEntity() {
setSuccessMessage("");
setError(false);
setErrorMessage("");
setTechnicalErrorMessage("");
}
public T getObject() {
return object;
}
public void setObject(T object) {
this.object = object;
}
public boolean isError() {
return isError;
}
public void setError(boolean error) {
this.isError = error;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public String getTechnicalErrorMessage() {
return technicalErrorMessage;
}
public void setTechnicalErrorMessage(String technicalErrorMessage) {
this.technicalErrorMessage = technicalErrorMessage;
}
public String getSuccessMessage() {
return successMessage;
}
public void setSuccessMessage(String successMessage) {
this.successMessage = successMessage;
}}
但我得到的结果是 ResponseEntity<LinkedTreeMap>
,对象是 (Key->Value
) 的映射,而不是类型 ResponseEntity<T>
.
下图是在调试器中出现的:
GSON 应该如何理解,它应该使用哪个 class 代替 T
以及 "actual mapped object that send by the Type" 是什么来填充它的字段?我们在 Java 中有 type erasure 泛型,所以在运行时无法理解它 T
是什么。没办法,所以gson就用generic Map<String, String>()
.
看看这个question的回复,都是一样的情况。