系列文章:
替换 FastJSON:推荐 Jackson 及详细用法指南(含工具类 + 替换方案)
总结下Jackson 中的JsonNode,ObjectNode,ArrayNode的方法
JsonNode 和 ObjectNode的区别以及他们能互换吗
Jackson 使用问题记录(持续更新)
本文将持续记录我在使用 Jackson 进行 JSON 序列化与反序列化过程中遇到的各种问题和解决方案,适合正在使用或准备替换 FastJSON 的 Java 开发者参考。
问题一:非静态内部类无法反序列化
0、使用
@Test
public void test2() throws JsonProcessingException {
String json = "{\"username\":\"admin\",\"nickName\":\"若依\",\"userId\":1}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println(user.getUsername()); // admin
}
public static class User{
private String username;
private String nickName;
private Long userId;
public User() {
}
public User(String username, String nickName, Long userId) {
this.username = username;
this.nickName = nickName;
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
}
1、异常信息:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot construct instance of `com.wenge.business.JackSonTest$User`:
non-static inner classes like this can only be instantiated using default, no-argument constructor
2、出现场景:
当你尝试将一个 非静态内部类(non-static inner class) 作为 Jackson 反序列化的目标类型时,会抛出该异常。
例如:
public class JackSonTest {
public class User { ... }
}
3、原因分析:
Java 中的非静态内部类隐式持有外部类的引用,因此不能通过默认无参构造函数创建实例。而 Jackson 默认依赖无参构造函数来构建对象,所以无法反序列化这类对象。
4、解决办法:
方法一:改为 static 静态内部类(推荐)
public class JackSonTest {
public static class User {
private String name;
// 必须提供无参构造函数
public User() {}
// getter / setter
}
}
方法二:提取为独立类(更推荐)
// 文件名:User.java
public class User {
private String name;
// 必须提供无参构造函数
public User() {}
// getter / setter
}
5、小结:
| 问题 | 原因 | 解决方法 |
|---|---|---|
| Jackson 无法反序列化非静态内部类 | 内部类需要外部类实例,无法通过无参构造创建 | 改为 static 类 或 提取为独立类 |
1958

被折叠的 条评论
为什么被折叠?



