方法:hutool的JSONUtil
@Data
public class MyResponse<T> {
private String msg;
private T data;
}
@Data
public class MyObj {
private String name;
}
public static void main(String[] args) {
MyResponse<MyObj> myResponse2 = JSONUtil.toBean("{\"msg\":\"msg\", \"data\":{\"name\":\"bb\"}}", new TypeReference<MyResponse<MyObj>>() {}, false);
System.out.println(myResponse2);
}
注意:实体类必须要有无参构造
在项目中的CommonResult如下,而在对接三方接口时,需要接收返回值,因此我直接就复制了一份过去,而后发现JSON转换失败(ThirdResult)
@Data
@RequiredArgsConstructor
public class CommonResult<T> extends BaseBean {
/**
* 状态编码
*/
@NonNull Integer code;
/**
* 状态描述
*/
@NonNull String message;
//...
}
@Data
public class ThirdResult<T> extends BaseBean {
/**
* 错误码
*/
@NonNull int code;
/**
* 提示信息
*/
@NonNull String msg;
/**
* 返回结果
*/
private T data;
}
1、一步步点进去看后会发现在获取构造器的时候为null,因此就会出个空指针异常
2、为什么没有构造器,因为@NonNull注解
在加上了@NonNull注解后,就会生成一个带参构造,那么无参没显式声明,则会被覆盖,所以需要去掉@NonNull或手动加上无参构造
小结
这次就是没搞懂@NonNull的作用,直接一股脑的CV过来,导致转换报错,以后大家在CV的时候不需要的东西还是要去掉的好,避免出现问题