当前位置: 首页 > news >正文

Java-Spring入门指南(十八)JSON字符串的解析与对象转换

Java-Spring入门指南(十八)JSON字符串的解析:项目间交互与对象转换

  • 前言
  • 一、为什么选择JSON?—— 作用与核心优势
    • (1)传统表单与JSON的对比
    • (2)JSON的核心优势
  • 二、环境准备:导入JSON解析依赖
    • (1)在pom.xml中添加Jackson依赖
    • (2)依赖作用说明
  • 三、核心实战1:手动实现JSON与Java对象的转换
    • (1)准备实体类(复用+扩展)
      • ① Address.java(嵌套实体类)
      • ② 扩展User.java(添加Address属性)
    • (2)手动转换代码实现(测试类)
    • (3)测试结果与核心说明
  • 四、核心实战2:SpringMVC自动JSON转换
    • (1)自动转换的原理
    • (2)Controller层实现自动转换
    • (3)用Apipost测试自动转换接口
      • ① 测试“接收JSON→Java对象”(/json/accept)
      • ② 测试“返回Java对象→JSON”(/json/return)
      • ③ 测试“返回List→JSON数组”(/json/returnList)

前言

  • 在上一篇博客中,我们通过Apipost完成了RestFul接口的测试,验证了HTTP方法与参数传递的逻辑,但实际开发中,项目间交互(如订单系统调用用户系统)或前后端分离(前端Vue/React调用后端接口)时,数据传递很少用传统表单(application/x-www-form-urlencoded),而是以JSON格式为主。
  • JSON(JavaScript Object Notation)是一种轻量级数据交换格式,具有易读、跨语言、体积小的特点,能完美解决“复杂数 据结构传递”问题(如嵌套对象、数组)。本文的核心目标就是掌握:如何将Java对象打包为JSON字符串,如何将JSON字符串解析为Java对象,以及项目间如何通过JSON实现数据交互。
  • 本文将延续Maven+IDEA+Tomcat 11环境,基于上一篇的RestFul项目结构,从依赖导入、手动转换、SpringMVC自动转换,到项目间交互实战,逐步打通JSON数据处理全流程。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482

在这里插入图片描述


上一篇博客地址
https://blog.csdn.net/2402_83322742/article/details/152360028?spm=1001.2014.3001.5501

一、为什么选择JSON?—— 作用与核心优势

在讲技术实现前,先明确JSON的定位:它不是SpringMVC专属,而是跨语言、跨项目的数据交换标准,解决了“不同系统间数据格式不兼容”的问题。我们先对比传统表单与JSON,理解其核心价值。

(1)传统表单与JSON的对比

以“用户登录”为例,传统表单与JSON传递数据的差异如下:

传递方式数据格式示例适用场景缺点
传统表单(GET)http://localhost:8080/login?username=zhangsan&password=123简单键值对、参数少1. 参数暴露在URL,不安全;2. 无法传递嵌套数据(如用户的地址对象)
传统表单(POST)请求体:username=zhangsan&password=123application/x-www-form-urlencoded简单键值对、非敏感数据无法传递复杂结构(如数组、嵌套对象)
JSON请求体:{"username":"zhangsan","password":"123","address":{"city":"Beijing","street":"Main Road"}}application/json复杂数据、前后端分离、项目间交互需额外解析(但SpringMVC可自动处理)

(2)JSON的核心优势

  1. 轻量级:相比XML(需大量标签),JSON体积更小,传输速度更快,尤其适合网络带宽有限的场景。
  2. 跨语言:无论后端是Java/Python/Go,前端是JavaScript,都能直接解析JSON(内置或轻量库支持),无兼容性问题。
  3. 支持复杂结构:可直接传递嵌套对象(如用户包含地址)、数组(如用户列表),无需手动拆分参数。
  4. 易读性:人类可直接看懂JSON结构,便于开发调试(如Apipost/Postman中可直接格式化显示)。

二、环境准备:导入JSON解析依赖

SpringMVC默认推荐使用Jackson作为JSON解析工具(官方集成,无需额外配置),核心依赖是jackson-databind,它包含了“Java对象转JSON”和“JSON转Java对象”的所有功能。

(1)在pom.xml中添加Jackson依赖

打开项目的pom.xml,新增以下依赖(版本与Spring 6.2.10兼容,推荐2.15.x版本):

<!-- Jackson核心依赖:实现Java对象与JSON的相互转换 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.2</version> <!-- 稳定版,与Spring 6.x兼容 -->
</dependency>
<!-- Jackson注解依赖:支持自定义JSON转换(如日期格式、忽略空值) -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.15.2</version>
</dependency>

在这里插入图片描述

  • 并在web环境中导入库文件

在这里插入图片描述

(2)依赖作用说明

  • jackson-databind:核心包,提供ObjectMapper类(JSON转换的核心工具类),无需手动创建,SpringMVC会自动配置。
  • jackson-annotations:提供注解支持,如@JsonProperty(指定JSON字段名与Java属性名映射)、@JsonFormat(指定日期格式),解决“字段名不一致”“日期格式乱码”等问题。

三、核心实战1:手动实现JSON与Java对象的转换

手动转换适合理解底层逻辑(如自定义转换规则),核心工具是com.fasterxml.jackson.databind.ObjectMapper,主要有两个核心方法:

  • writeValueAsString(Object obj):将Java对象转换为JSON字符串。
  • readValue(String jsonStr, Class<T> clazz):将JSON字符串转换为指定类型的Java对象。

(1)准备实体类(复用+扩展)

复用之前的User类,并新增Address类(演示嵌套对象,体现JSON处理复杂结构的优势):

① Address.java(嵌套实体类)

package com.niit.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;// Lombok注解:自动生成getter/setter/构造方法/toString
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {private String city;    // 城市private String street;  // 街道
}

在这里插入图片描述

② 扩展User.java(添加Address属性)

package com.niit.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private String username;    // 用户名(与JSON字段名一致)private String password;    // 密码private Integer age;        // 年龄private Address address;    // 嵌套地址对象(复杂结构)// 示例:自定义日期格式(解决JSON日期默认显示为时间戳的问题)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date loginTime;     // 登录时间
}

关键注解说明@JsonFormat指定日期转换格式为“年-月-日 时:分:秒”,并设置时区为东八区,避免日期显示为1620000000000这种时间戳。
在这里插入图片描述

(2)手动转换代码实现(测试类)

src/test/java下创建JsonTest类,编写测试方法,验证两种转换方向:

package com.niit.test;import com.fasterxml.jackson.databind.ObjectMapper;
import com.niit.pojo.Address;
import com.niit.pojo.User;
import org.junit.Test;
import java.util.Date;public class JsonTest {// 核心工具类:ObjectMapper(Jackson的核心,线程安全,可全局复用)private final ObjectMapper objectMapper = new ObjectMapper();/*** 测试1:Java对象 → JSON字符串*/@Testpublic void testObjectToJson() throws Exception {// 1. 创建嵌套对象(Address)Address address = new Address("Beijing", "Main Road 100号");// 2. 创建Java对象(User)User user = new User("zhangsan", "123456", 25, address, new Date());// 3. 转换为JSON字符串(核心方法:writeValueAsString)String jsonStr = objectMapper.writeValueAsString(user);// 4. 打印结果(控制台查看JSON格式)System.out.println("Java对象转JSON字符串:");System.out.println(jsonStr);}/*** 测试2:JSON字符串 → Java对象*/@Testpublic void testJsonToObject() throws Exception {// 1. 定义JSON字符串(模拟项目间传递的JSON数据,注意字段名与User属性名一致)String jsonStr = "{" +"\"username\":\"lisi\"," +"\"password\":\"654321\"," +"\"age\":28," +"\"address\":{" +"\"city\":\"Shanghai\"," +"\"street\":\"Nanjing Road 50号\"" +"}," +"\"loginTime\":\"2024-10-01 14:30:00\"" +"}";// 2. 转换为Java对象(核心方法:readValue,第二个参数是目标类的Class)User user = objectMapper.readValue(jsonStr, User.class);// 3. 打印结果(验证是否正确转换,尤其是嵌套对象和日期)System.out.println("\nJSON字符串转Java对象:");System.out.println(user);System.out.println("嵌套地址:" + user.getAddress().getCity());}
}

在这里插入图片描述

(3)测试结果与核心说明

  1. 运行testObjectToJson():控制台输出JSON字符串(嵌套结构正确,日期格式为自定义格式):

在这里插入图片描述

  1. 运行testJsonToObject():控制台输出Java对象(嵌套的Address被正确解析,日期格式正确):
    在这里插入图片描述

四、核心实战2:SpringMVC自动JSON转换

手动转换仅用于理解逻辑,实际开发中,SpringMVC通过@RequestBody@ResponseBody(或@RestController)实现自动JSON转换,无需手动调用ObjectMapper,极大简化代码。

(1)自动转换的原理

SpringMVC在启动时,会自动检测jackson-databind依赖,然后配置MappingJackson2HttpMessageConverter(JSON消息转换器),实现:

  • 当请求头为Content-Type: application/json时,@RequestBody会自动将请求体的JSON字符串转为Java对象。
  • 当方法返回Java对象时,@ResponseBody会自动将Java对象转为JSON字符串,响应头设为Content-Type: application/json

(2)Controller层实现自动转换

com.niit.controller下创建JsonController,编写3个接口,覆盖“JSON转对象”“对象转JSON”“复杂对象转JSON”场景:

package com.niit.controller;import com.niit.pojo.User;
import org.springframework.web.bind.annotation.*;import java.util.Arrays;
import java.util.Date;
import java.util.List;// @RestController = @Controller + @ResponseBody,所有方法返回值自动转为JSON
@RestController
@RequestMapping("/json")
public class JsonController {/*** 场景1:接收JSON → 自动转为Java对象(@RequestBody)* 请求:POST http://localhost:8080/json/accept* 请求体:JSON字符串* 请求头:Content-Type: application/json*/@PostMapping("/accept")// @RequestBody:自动将JSON请求体转为User对象public String acceptJson(@RequestBody User user) {// 直接使用转换后的User对象(无需手动解析)System.out.println("接收的用户信息:" + user);System.out.println("用户地址:" + user.getAddress().getCity());return "JSON接收成功!用户名:" + user.getUsername();}/*** 场景2:返回Java对象 → 自动转为JSON(@RestController已包含@ResponseBody)* 请求:GET http://localhost:8080/json/return* 响应:JSON字符串(User对象自动转换)*/@GetMapping("/return")public User returnJson() {// 创建Java对象(模拟从数据库查询的数据)User user = new User();user.setUsername("wangwu");user.setPassword("888888");user.setAge(30);user.setLoginTime(new Date()); // 日期会自动按@JsonFormat格式转换// 返回User对象,SpringMVC自动转为JSONreturn user;}/*** 场景3:返回复杂结构(数组)→ 自动转为JSON数组* 请求:GET http://localhost:8080/json/returnList* 响应:JSON数组(List<User>自动转换)*/@GetMapping("/returnList")public List<User> returnJsonList() {// 模拟用户列表(复杂结构)User user1 = new User("zhaoliu", "111111", 22, null, new Date());User user2 = new User("qianqi", "222222", 24, null, new Date());List<User> userList = Arrays.asList(user1, user2);// 返回List,SpringMVC自动转为JSON数组return userList;}
}

在这里插入图片描述

(3)用Apipost测试自动转换接口

启动Tomcat,用Apipost测试3个接口,验证自动转换是否生效:

① 测试“接收JSON→Java对象”(/json/accept)

  1. 新建接口,请求方法选POST,URL填http://localhost:8080/json/accept
  2. 配置请求头:点击“Headers”,新增Content-Type: application/json

在这里插入图片描述

  1. 配置请求体:点击“Body”→“raw”→“JSON”,输入以下JSON:
    {"username":"zhangsan","password":"123456","age":25,"address":{"city":"Guangzhou","street":"Tianhe Road 30号"},"loginTime":"2024-10-01 15:00:00"
    }
    

在这里插入图片描述

  1. 点击“发送”,预期结果:
    • 响应体显示JSON接收成功!用户名:zhangsan
    • IDEA控制台打印接收的用户信息:User(...),嵌套的Address正确解析。

在这里插入图片描述

② 测试“返回Java对象→JSON”(/json/return)

  1. 新建接口,请求方法选GET,URL填http://localhost:8080/json/return
  2. 直接点击“发送”,预期结果:
    • 响应体为JSON字符串,字段名与User属性一致,日期格式为2024-10-01 15:30:00
    • 响应头Content-Type自动设为application/json

在这里插入图片描述

③ 测试“返回List→JSON数组”(/json/returnList)

  1. 新建接口,请求方法选GET,URL填http://localhost:8080/json/returnList
  2. 点击“发送”,预期结果:
    • 响应体为JSON数组,包含2个User对象,格式正确。

在这里插入图片描述


我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述

http://www.dtcms.com/a/430747.html

相关文章:

  • JavaScript 严格模式
  • 数据时代的基石 —— 数据库的核心价值:MySQL 三大范式精讲
  • **跨平台开发:发散创新,探索无界限**随着技术的飞速发展,跨平台开发已经成为软件开发的必然趋势
  • 2025年中小工程企业成本管理新突破:如何选对管理软件?
  • JVM初始堆大小和最大堆大小多少合适?
  • 网站汉英结合的怎么做织梦欧美网站模板
  • 构建AI智能体:五十、ModelScope MCP广场 · MCP协议 · Cherry Studio:AI应用生产线
  • 从零开始:MCP数据库助手(二)- 核心功能实现
  • Django Admin 完全指南:内置功能、高级使用与第三方扩展
  • Django 路由详解
  • Django Admin 配置完全指南:从基础到高级实战
  • MySQL 全量 + 增量备份脚本(RPM 安装)实践与问题解析
  • 嘉兴网站建设方案外包运营推广公司
  • 第6章串数组:稀疏矩阵三元组顺序表的行逻辑连接顺序表
  • MATLAB仿真:编程基础实验全解析——从入门到实战
  • [特殊字符]灵感补给站 | pinterest 设计灵感分享 UI版面设计2
  • seo与网站建设php网站开发文档模板
  • GameObject 常见类型详解 -- 任务给予对象(QUESTGIVER)
  • docker部署mssql
  • 网站备案能查到什么wordpress关键字设置
  • LAMA(2014): 一项对SCADE模型进行基于SMT验证的开源方案
  • 从AGI到ASI演化的路径与启示
  • 重庆孝爱之家网站建设邢台是哪个省的城市
  • 【Linux学习笔记】线程概念和控制(二)
  • AES-128 CMAC:保障嵌入式通信安全的认证算法
  • Oumi:开源的AI模型一站式开发平台,涵盖训练、评估和部署模型
  • 大数据消息中间件选型终极指南:深度解析Kafka、Pulsar、RocketMQ架构与性能
  • 网站推广排名收费南昌做企业网站
  • 【Mosquitto的数据流程架构】
  • 新手学网站建设视频教程共30课高清版做网站需要编程