GSON无法转换泛型<t>属性

时间:2017-11-11 21:54:58

标签: java rest generics gson json-deserialization

我目前使用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无法反序列化?我究竟错过了什么?

1 个答案:

答案 0 :(得分: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);