Spring Boot 接口一个 JSON 字符串用两个对象去接收,这能行吗?

news2024/12/28 21:33:33

文章目录

    • 需求场景
    • 解决方案
      • Step 1: 创建 `Person` 和 `Address` 类
      • Step 2: 创建 `PersonWithAddress` 类
      • Step 3: 自定义转换器
      • Step 4: 配置转换器
      • Step 5: 使用 `@RequestBody` 接收 JSON 数据
    • 结论

在这里插入图片描述

🎉欢迎来到SpringBoot框架学习专栏~


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:SpringBoot
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

在 Spring Boot 开发过程中,我们常常需要处理前端传递过来的 JSON 数据。通常,我们会使用一个对象来接收这些数据,但有时我们可能会遇到一些特殊需求,比如将一个 JSON 字符串拆分到两个对象中。本文将探讨如何在 Spring Boot 中实现这一需求,并给出详细的代码示例和解释。

在这里插入图片描述

需求场景

假设我们有这样一个 JSON 字符串:

{
  "name": "John",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "Springfield"
  }
}

我们希望将这个 JSON 字符串中的 nameage 字段映射到一个对象 Person 中,而 address 字段映射到另一个对象 Address 中。这种需求在处理复杂的数据结构时并不少见。

解决方案

要实现这个功能,我们可以利用 Spring Boot 的 @RequestBody 注解和自定义的转换器。具体步骤如下:

  1. 创建两个接收 JSON 数据的类 PersonAddress
  2. 创建一个包含这两个对象的类 PersonWithAddress
  3. 自定义一个转换器,将 JSON 数据转换为 PersonWithAddress 对象。
  4. 在控制器中使用 @RequestBody 注解接收 JSON 数据。

Step 1: 创建 PersonAddress

首先,我们定义 PersonAddress 类:

public class Person {
    private String name;
    private int age;

    // Getters and Setters
}
public class Address {
    private String street;
    private String city;

    // Getters and Setters
}

Step 2: 创建 PersonWithAddress

接下来,我们定义一个包含 PersonAddress 对象的类:

public class PersonWithAddress {
    private Person person;
    private Address address;

    // Getters and Setters
}

Step 3: 自定义转换器

我们需要创建一个自定义转换器,将 JSON 数据转换为 PersonWithAddress 对象。这里我们使用 Jackson 的 ObjectMapper 进行转换:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class PersonWithAddressConverter extends AbstractJackson2HttpMessageConverter {

    public PersonWithAddressConverter(ObjectMapper objectMapper) {
        super(objectMapper);
    }

    @Override
    protected boolean canRead(MediaType mediaType) {
        return true;
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        return PersonWithAddress.class.equals(clazz);
    }

    @Override
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(inputMessage.getBody());
        
        Person person = new Person();
        person.setName(rootNode.get("name").asText());
        person.setAge(rootNode.get("age").asInt());
        
        Address address = new Address();
        address.setStreet(rootNode.get("address").get("street").asText());
        address.setCity(rootNode.get("address").get("city").asText());
        
        PersonWithAddress personWithAddress = new PersonWithAddress();
        personWithAddress.setPerson(person);
        personWithAddress.setAddress(address);
        
        return personWithAddress;
    }
}

Step 4: 配置转换器

在 Spring Boot 中配置自定义的转换器:

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final PersonWithAddressConverter personWithAddressConverter;

    public WebConfig(PersonWithAddressConverter personWithAddressConverter) {
        this.personWithAddressConverter = personWithAddressConverter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(personWithAddressConverter);
    }
}

Step 5: 使用 @RequestBody 接收 JSON 数据

在控制器中接收 JSON 数据并处理:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PersonController {

    @PostMapping("/person")
    public String createPerson(@RequestBody PersonWithAddress personWithAddress) {
        Person person = personWithAddress.getPerson();
        Address address = personWithAddress.getAddress();
        
        return "Received person: " + person.getName() + ", age: " + person.getAge() +
                " with address: " + address.getStreet() + ", " + address.getCity();
    }
}

结论

通过以上步骤,我们成功实现了将一个 JSON 字符串拆分到两个对象中的需求。在实际应用中,这种方法可以帮助我们更灵活地处理复杂的数据结构,使代码更加清晰和可维护。

这种方法不仅仅适用于简单的对象拆分,还可以扩展到更复杂的场景中。希望本文对你理解和实践 Spring Boot 中的 JSON 数据处理有所帮助。如果有任何问题或改进建议,欢迎在评论区留言讨论。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1865488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依项目实战------企业人力资源管理平台

一、数据库名称规范化及建表相关 1.术语名称 1.系统名称&#xff1a;企业人力资源管理平台英文翻译&#xff1a;Enterprise Human Resource Management Platform缩写&#xff1a;EHR 2.员工信息管理&#xff08;Employee Information Management 缩写&#xff1a;EIM&#…

Vue3抽屉(Drawer)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传width宽度&#xff0c;在 placement 为 right 或 left 时使用string | number378falseheight高度&#xff0c;在 placement 为 top 或 bottom 时使用string | number378falsetitle标题string | slotundefinedfalse…

Docker(八)-Docker运行mysql8容器实例

1.运行mysql8容器实例并挂载数据卷 -e:配置环境变量 --lower_case_table_names1 设置忽略表名大小写一定要放在镜像之后运行mysql8容器实例之前&#xff0c;先查看是否存在mysql8镜像以及是否存在已运行的mysql实例docker run -d -p 3306:3306 --privilegedtrue -v 【宿主机日…

Jenkins流水线发布,一篇就解决你的所有疑惑

这次搭建的项目比较常规,前端是react写的,后端是springboot,并且由于是全栈开发,所以是在同一个项目中。接下来我演示下怎么用jenkins进行自动化发布。 1.jenkins必装插件 这里用到的是jenkinsFile主要是基于Groovy这个沙盒,有些前置插件。这里使用maven进行打包,所以需…

公益培训|半导体与集成电路项目制培训项目

关于我们 硬蛋产业学院&#xff0c;基于硬蛋创新(http://00400.HK)在芯片产业的资源和技术优势&#xff0c;引进全球领先的芯片应用技术&#xff0c;为国内培养芯片应用技术人才&#xff0c;助力芯片应用产业发展。 硬蛋产业学院在国家各主管部门、广东省、深圳市及社会各界的大…

一码多址与同义词解决方案

随着地址库中的数据不断的丰富&#xff0c;地址库中一码多址和同义词的数据也会越来越多&#xff0c;一码多址和同义词在统一地址管理平台中的概念并不相同。 一码多址指的是多个地址编码相同&#xff0c;例如通过民政地址找到编码&#xff0c;再通过编码找到房产地址描述。 本…

使用Python和jieba库生成中文词云

使用Python和jieba库生成中文词云 在文本分析和数据可视化的领域中&#xff0c;词云是一种展示文本数据中关键词频率的直观方式。Python作为一种强大的编程语言&#xff0c;提供了多种库来帮助我们生成词云&#xff0c;如wordcloud和jieba。在本文中&#xff0c;我们将通过一个…

谷歌SEO是什么意思?

谷歌SEO&#xff08;Search Engine Optimization&#xff09;是通过优化网站内容和结构&#xff0c;使其在谷歌搜索引擎中排名更高的策略和技术。这不仅仅是提高网站排名&#xff0c;更是吸引目标受众、增加流量并最终提升业务转化的关键方法之一。谷歌搜索引擎优化&#xff08…

在win7系统电脑安装node16的版本(已成功安装运行)

很多银行的项目行方都要求内网开发&#xff0c;但是我遇到的几个银行基本都是win7系统的电脑&#xff0c;而前端的项目又是需要高版本的node才能跑起来&#xff0c;所有就记录此解决方案文章&#xff01; 这是下载node安装包的地址&#xff1a;Index of /dist/ 在这里先下载自…

C# unknow column “p0.TaskTypeId‘ in ‘field list‘

这个问题就是数据库出现问题&#xff0c;去 日志中去看 &#xff0c;找个具体表去 看实体类&#xff0c;与数据库中的表&#xff0c;是否存在字段。

【Qt】初识QtQt Creator

一.简述Qt 1.什么是Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式&#xff0c;开发者可以通过简单的拖拽和组合来实现…

【Java Web】Tomcat服务器

目录 一、Tomcat是什么 二、Tomcat安装 三、Tomcat相关目录 四、Web项目标准目录结构规范 五、Tomcat项目部署方式 六、IDEA关联本地Tomcat 七、HTTP协议 7.1 http的交互方式 7.1.1 http长连接和短连接 7.1.2 http1.1缓存机制 7.2 http数据报文格式 八、常见响应状态码 一、Tom…

大数据平台需要存算分离吗?某保险集团:以 ZBS 优化资源利用率,缩短业务用时超一半

金融机构普遍采用“存算一体”架构支撑基于 Hadoop 框架的大数据平台。而随着金融业务的多元化发展&#xff0c;不同业务对计算和存储的需求差异较大&#xff0c;由于“存算一体”架构共享存储与计算资源&#xff0c;经常会出现资源需求不均衡、资源利用率低下、难以灵活调度等…

贪吃蛇项目:GameRun与GameEnd部分:游戏的主体运行与善后部分

准备工作&#xff1a;打印得分信息 在进行GameStart之前&#xff0c;我们需要在地图的右侧打印帮助信息&#xff0c;以及目前玩家的得分情况和一个食物在当前速度下的得分情况&#xff08;加速的状态下按比例增加食物的分数&#xff0c;减速的状态下则相反&#xff09;&#xf…

历史与未来的交响曲:历史建筑保护与现代技术的完美融合

在时间的长河中&#xff0c;历史建筑如同凝固的诗篇&#xff0c;记录着过往的辉煌与沧桑。然而&#xff0c;岁月的侵蚀、自然灾害的威胁以及现代化进程的冲击&#xff0c;使这些宝贵的文化遗产面临前所未有的挑战。作为建筑设计领域的探索者&#xff0c;我们肩负着保护历史记忆…

多空分歧中,盘点全球“新股王”背后的这些在港概念股

冲榜成功。6月18日收盘&#xff0c;英伟达(NVDA.US)股价创新高&#xff0c;报135.58美元&#xff0c;总市值3.34万亿美元&#xff0c;一举超越微软、苹果公司&#xff0c;成为全球“新股王”。 不过&#xff0c;随着这一历史性时刻的出现&#xff0c;由于当前无法准确预估市场…

vue配置中的process.env

项目中的.env开头的文件是否知道是干什么的呢 主要是为了区分测试环境还是生产环境env.development为测试环境 # 测试环境 NODE_ENV development VUE_APP_BASE_API http://xxxxxxxxx // 命名一定要以 VUE_APP_ 开头&#xff0c;要不然根本取不到 .env.production为生产环境…

浏览器扩展V3开发系列之 chrome.runtime 的用法和案例

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 chrome.runtime API 提供了一系列的方法和事件&#xff0c;可以通过它来管理和维护 Chrome 扩展的生命…

用两个钟,我又在VMWARE上搞了一套内部网配置

最近要学es&#xff0c;所以打算自己用虚拟机搞个NAT&#xff0c;又搞了两个钟。为了不再费劲尝试&#xff0c;也为了造福大众&#xff0c;所以选择搞一份NAT笔记&#xff01;&#xff01;&#xff01;&#xff01; 1.初始化网关和DNS 我们给网关配置一个地址192.168.96.1&…

计算机图形学入门20:加速光线追踪

1.前言 前文说了Whitted-style光线追踪技术的原理以及光线与平面的交点计算方式&#xff0c;对于现在应用最广的Polygon Mesh显式曲面来说&#xff0c;一个复杂场景中的多边形面总数可能达到千万甚至亿万以上&#xff0c;如果每个像素发射光线都和场景中每个平面进行求交点计算…