【问题标题】:GSON could not convert generic <T> attributeGSON 无法转换通用 <T> 属性
【发布时间】:2017-11-11 21:54:57
【问题描述】:

我目前使用 Google 的 GSON 库来序列化/反序列化休息服务响应。 但我有一个小问题。我的响应对象有T response 属性。

public class IninalResponse<T> {

    private int httpCode;
    private String description;
    private T response;
    private HashMap<String,String> validationErrors;

    ...
}

我想根据我指定的对象类型获取response 属性。在这个例子中,我使用GetAccessTokenResponse 指定反序列化下面代码中的T response 属性。

public IninalResponse getAccessToken(String apikey) {
    String path = "https://sandbox-api.ininal.com/v2/oauth/accesstoken";
    return doPostIninal(apikey,path,null,GetAccessTokenResponse.class);
}

GSON library 成功反序列化 IninalResponse 对象,T response 字段除外。 Gson 将其反序列化为 LinkedTreeMap 类型对象。

public <T,V> IninalResponse doPostIninal(String apikey, String path,V requestBody, T response) {
    RestTemplate template = restClient.getRestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.add(HttpHeaders.AUTHORIZATION,apikey);
    headers.add(HttpHeaders.DATE, "");
    headers.add(HttpHeaders.CONTENT_TYPE, "application/json");

    HttpEntity<?> request = new HttpEntity<Object>(requestBody,headers);
    ResponseEntity<String> accessTokenResponse = restClient.getRestTemplate().postForEntity(path,request,String.class);

    IninalResponse<T> responseBody = new IninalResponse<T>();
    responseBody = new Gson().fromJson(accessTokenResponse.getBody(),responseBody.getClass());
    System.out.println(accessTokenResponse);
    return responseBody;
}

我仍然不知道为什么 gson 不能反序列化?我到底错过了什么?

【问题讨论】:

  • 试一试:public IninalResponse getAccessToken(String apikey) 并始终将方法的结果分配给类型化对象,例如: InitialResponse v = getac

标签: java rest generics gson json-deserialization


【解决方案1】:

由于Java 的类型擦除,您需要使用技巧来序列化/反序列化泛型类型:

Type fooType = new TypeToken<IninalResponse<TheType>>() {}.getType();    
gson.fromJson(accessTokenResponse.getBody(), fooType);

其中TheType 是您在序列化期间传入的类型(我想是String)。

序列化是这样的:

Type fooType = new TypeToken<IninalResponse<String>>() {}.getType(); // I assume it was a String here.    
gson.toJson(someString, fooType);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2019-02-08
    相关资源
    最近更新 更多