一次fastjson引起的bug
2021-07-21 本文已影响0人
修行者12138
有一个简单的响应类Response和学生类Student
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Response<T> {
/**
* 返回的消息内容
*/
String msg;
/**
* 返回的数据
*/
T data;
public static <T> Response success(String message, T data) {
return Response.builder().msg(message).data(data).build();
}
public static <T> Response fail(String message, T data) {
return Response.builder().msg(message).data(data).build();
}
}
@Data
@AllArgsConstructor
@Slf4j
public class Student {
private String name;
private Integer age;
}
还有一段符合Reponse<List<Student>>格式的json字符串
{
"data":[
{
"age":23,
"name":"ltm"
},
{
"age":22,
"name":"zlp"
}
],
"msg":"success"
}
使用fastjson把json字符串转成Reponse<List<Student>>
下面这段代码
public static void main(String[] args) {
Student student = getFirstStudent();
}
private static Student getFirstStudent() {
String jsonStr = "{\"data\":[{\"age\":23,\"name\":\"ltm\"},{\"age\":22,\"name\":\"zlp\"}],\"msg\":\"success\"}";
Response<List<Student>> copy = JSON.parseObject(jsonStr, Response.class);
log.info(JSON.toJSONString(copy));
return copy.getData().get(0);
}
编译阶段不会报错,但是运行报错
Exception in thread "main" java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.crazyboy.consul.entity.Student
正确的解法是
private static Student getFirstStudent() {
String jsonStr = "{\"data\":[{\"age\":23,\"name\":\"ltm\"},{\"age\":22,\"name\":\"zlp\"}],\"msg\":\"success\"}";
Response<List<Student>> copy = JSON.parseObject(jsonStr, new TypeReference<Response<List<Student>>>(){});
log.info(JSON.toJSONString(copy));
return copy.getData().get(0);
}