一 前言
抛出异常:
// class为你类型转化的类的全限定名
com.google.gson.internal.LinkedTreeMap cannot be cast to my class
需要解析的类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class RequestBean {
User user;
String token;
String clientUrl;
String authToken;
}
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResultBean<T> implements Serializable {
private static final long serialVersionUID = 1L;
public static final int NO_LOGIN = -1;
public static final int SUCCESS = 0;
public static final int FAIL = 1;
public static final int NO_PERMISSION = 2;
private String msg = "success";
private int code = SUCCESS;
private T data;
public ResultBean() {
super();
}
public ResultBean(T data) {
super();
this.data = data;
}
public ResultBean(Throwable e) {
super();
this.msg = e.toString();
this.code = FAIL;
}
}
二 正文
一般而言,我们在使用Gson解析数据的时候会采用:
strJson = "{"msg":"success","code":0,"data":{"user":null,"token":null,"clientUrl":null,"authToken":null}}";
ResultBean<Data> resultBean = VerifyUtil.cast(gson.fromJson(strJson, ResultBean.class));
进行解析,但这样子有一个缺点,就是ResultBean中没有办法定义泛型的类型,这也导致了Gson无法知道泛型的类型为何。
在上述给出的代码中,解析后输出data的值:
System.out.println(resultBean.getData());
// 以下为输出结果
// {user=null, token=null, clientUrl=null, authToken=null}
并且在调用data对象时会抛出上述异常:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.hc.hcsso.dtos.Data
那么要解决上述的问题只要让Gson知道泛型中的类型就行了:
Type type = new TypeToken<ResultBean<Data>>() {
}.getType();
ResultBean<Data> resultBean = gson.fromJson(strJson, type);
这样就能够解析成功。
记录一下自己犯过的错…