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=123 (application/x-www-form-urlencoded ) | 简单键值对、非敏感数据 | 无法传递复杂结构(如数组、嵌套对象) |
JSON | 请求体:{"username":"zhangsan","password":"123","address":{"city":"Beijing","street":"Main Road"}} (application/json ) | 复杂数据、前后端分离、项目间交互 | 需额外解析(但SpringMVC可自动处理) |
(2)JSON的核心优势
- 轻量级:相比XML(需大量标签),JSON体积更小,传输速度更快,尤其适合网络带宽有限的场景。
- 跨语言:无论后端是Java/Python/Go,前端是JavaScript,都能直接解析JSON(内置或轻量库支持),无兼容性问题。
- 支持复杂结构:可直接传递嵌套对象(如用户包含地址)、数组(如用户列表),无需手动拆分参数。
- 易读性:人类可直接看懂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)测试结果与核心说明
- 运行
testObjectToJson()
:控制台输出JSON字符串(嵌套结构正确,日期格式为自定义格式):
- 运行
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)
- 新建接口,请求方法选
POST
,URL填http://localhost:8080/json/accept
。 - 配置请求头:点击“Headers”,新增
Content-Type: application/json
。
- 配置请求体:点击“Body”→“raw”→“JSON”,输入以下JSON:
{"username":"zhangsan","password":"123456","age":25,"address":{"city":"Guangzhou","street":"Tianhe Road 30号"},"loginTime":"2024-10-01 15:00:00" }
- 点击“发送”,预期结果:
- 响应体显示
JSON接收成功!用户名:zhangsan
。 - IDEA控制台打印
接收的用户信息:User(...)
,嵌套的Address正确解析。
- 响应体显示
② 测试“返回Java对象→JSON”(/json/return)
- 新建接口,请求方法选
GET
,URL填http://localhost:8080/json/return
。 - 直接点击“发送”,预期结果:
- 响应体为JSON字符串,字段名与User属性一致,日期格式为
2024-10-01 15:30:00
。 - 响应头
Content-Type
自动设为application/json
。
- 响应体为JSON字符串,字段名与User属性一致,日期格式为
③ 测试“返回List→JSON数组”(/json/returnList)
- 新建接口,请求方法选
GET
,URL填http://localhost:8080/json/returnList
。 - 点击“发送”,预期结果:
- 响应体为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
非常感谢您的阅读,喜欢的话记得三连哦 |