【问题标题】:How to deserialize JSON object from generic type in Java?如何从 Java 中的泛型类型反序列化 JSON 对象?
【发布时间】:2015-11-20 21:10:59
【问题描述】:

我正在尝试将 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类:

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&lt;LinkedTreeMap&gt;,并且对象是 (Key-&gt;Value) 的映射,而不是由类型 ResponseEntity&lt;T&gt; 发送的实际映射对象。

下图是调试器中出现的样子:

【问题讨论】:

  • 你能更清楚是什么问题吗?调试器似乎按要求显示地图。
  • @joshp,感谢您的关注,调试器将对象显示为实际对象的 TreeMap。例如,如果泛型 是类 UserDto 的实例,则脱盐 json 的对象必须是 UserDto 的对象到 TreeMap (Key->Value)

标签: java json generics mapping gson


【解决方案1】:

GSON 应该如何理解,应该使用哪个类来代替 T,以及填充其字段的“由类型发送的实际映射对象”是什么?我们有type erasure 用于Java 中的泛型,所以在运行时无法理解它T 是什么。没办法,所以 gson 只使用通用的Map&lt;String, String&gt;()

看看这个question的回复,情况一样。

【讨论】:

  • 非常感谢您的回复,我想知道他们是否正在解决这个问题。或者在 Web 服务客户端中从 Json String 到 java Object 的通用 Mapper 的最佳实践是什么?
猜你喜欢
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多