可以直接复制运行的「完整反序列化示例代码」 ,基于你原来的结构 ,但已经改成符合反序列化环境的正确写法。
我会分成 3 个文件(真实工程就是这样),逻辑非常清晰。
一、Test1.java(可反序列化的数据结构)
package org.example;
// 外部类(可以理解为一个命名空间)
public class Test1 {
// ✅ static 内部类:可以被反射、反序列化独立创建
public static class Test2 {
private int age;
private String name;
// ✅ 反序列化必须要的无参构造
public Test2() {
}
public Test2(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printInfo() {
System.out.println("name = " + name + ", age = " + age);
}
}
}
二、Main.java(反序列化环境模拟)
package org.example;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
// 模拟:来自网络 / 文件 / 接口 的 JSON 数据
String json = "{ \"age\": 11, \"name\": \"android\" }";
// 反序列化框架
ObjectMapper mapper = new ObjectMapper();
// ✅ 反序列化 static 内部类
Test1.Test2 t2 = mapper.readValue(json, Test1.Test2.class);
// 验证结果
t2.printInfo();
}
}
三、pom.xml(Jackson 依赖,必须)
如果你是 Maven 项目,加上这个依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>staticclass</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.1</version>
</dependency>
</dependencies>
</project>
四、运行结果(你应该看到)
name = android, age = 11
✅ 反序列化成功
五、如果你用的是「你原来的非 static 版本」
class Test1 {
class Test2 { }
}
这一行 一定会失败:
mapper.readValue(json, Test1.Test2.class);
原因一句话总结:
反序列化环境没有
Test1实例,无法构造非 static 内部类
六、这套代码在工程里的真实意义
你现在这套结构已经完全符合:
-
Controller 返回 DTO
-
接口 JSON 映射
-
RPC / MQ / 文件反序列化
错误代码如下:
package org.example;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
// 外部类(可以理解为一个命名空间)
class Test1 {
// ✅ static 内部类:可以被反射、反序列化独立创建
public class Test2 {
private int age;
private String name;
// ✅ 反序列化必须要的无参构造
public Test2() {
}
public Test2(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printInfo() {
System.out.println("name = " + name + ", age = " + age);
}
}
}
public class Main {
public static void main(String[] args) throws JsonProcessingException {
// 模拟:来自网络 / 文件 / 接口 的 JSON 数据
String json = "{ \"age\": 11, \"name\": \"android\" }";
// 反序列化框架
ObjectMapper mapper = new ObjectMapper();
// ✅ 反序列化 static 内部类
Test1.Test2 t2 = mapper.readValue(json, Test1.Test2.class);
// 验证结果
t2.printInfo();
}
}