Jackson 使用问题记录(持续更新)

系列文章:
替换 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 类 或 提取为独立类

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苍煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值