后端springboot的接收前端发来的数据反序列化原理

可以直接复制运行的「完整反序列化示例代码」基于你原来的结构 ,但已经改成符合反序列化环境的正确写法

我会分成 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();
    }
}
相关推荐
叫我Paul就好4 小时前
Spring 为何没有在 Java之外的地方存在?
java·后端·spring
xbgRS5 小时前
RocketMQ中的broker
java·rocketmq
晓晓_za8986685 小时前
Geo 优化源码二次开发:自定义地域规则改造实操文档
java·开发语言·搜索引擎·ci/cd·矩阵
摇滚侠5 小时前
《SpringBoot 3:入门与应用实战》第 8 章 AOP 的进阶机制和应用 阅读笔记 16
java·spring boot·笔记
AI人工智能+电脑小能手5 小时前
大白话说Java设计模式-38-迭代器模式(业务实战篇)
java·设计模式·迭代器模式·stream·遍历封装·集合通用·分页遍历
QQ_21696290965 小时前
【源码编号:project86570】SpringBoot电影院在线选座售票系统:电影排片、在线选座、订单购票、后台管理完整实战
java·spring boot·后端
谢亮_vipxieliang6 小时前
手机号验证技术方案:号段规则与正则表达式
java·服务器·spring boot·正则表达式·hibernate
wang09076 小时前
自己动手写一个tomcat之7监听器和过滤器
java·tomcat
梅孔立6 小时前
Pi-Agent 终极极简配置文档(Java+Vue+Python爬虫 4-5千文件项目)
java·vue.js·python
Query*6 小时前
Agent 开发之项目 AI Native 化:通过大模型与 RAG 赋予产品智能能力
java·人工智能·ai