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