一次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);
}
上一篇 下一篇

猜你喜欢

热点阅读