Jackson 使用问题记录(持续更新)
本文将持续记录我在使用 Jackson 进行 JSON 序列化与反序列化过程中遇到的各种问题和解决方案,适合正在使用或准备替换 FastJSON 的 Java 开发者参考。
问题一:非静态内部类无法反序列化
0、使用
@Testpublic 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 类 或 提取为独立类 |