可以直接复制运行的「完整反序列化示例代码」,基于你原来的结构,但已经改成符合反序列化环境的正确写法。
我会分成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(); } }