SpringBoot学习之Json数据交互的方法

在Spring Boot中,JSON数据的交互主要通过Controller层来实现,本文将详细介绍几种常用的JSON数据交互方法,包括请求路径参数、Body参数、请求头参数及Cookie等,以下是详细内容:
一、获取参数的几种常用注解
1. 请求路径参数
请求路径参数一般用于GET请求,用于查询数据,采用明文进行传输,常见的注解有@PathVariable和@RequestParam。
1.1 使用@PathVariable获取路径参数
URL示例:http://localhost:4001/api/unit/1
后端代码:
@RestController
public class HelloController {
@GetMapping("/hello/{id}/{name}")
public String sayHello(@PathVariable("id") Integer id, @PathVariable("name") String name) {
return "id:" + id + " name:" + name;
}
}
1.2 使用@RequestParam获取查询参数
URL示例:http://localhost:4001/api/unit?code=111
后端代码:
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello(@RequestParam Integer id) {
return "id:" + id;
}
}
2. Body参数
Body参数主要用于POST请求,推荐使用JSON格式传值,常用的注解是@RequestBody。
2.1 使用@RequestBody接收JSON数据
前端代码(jQuery Ajax):
$.ajax({
type: 'POST',
url: "/login",
contentType: "application/json",
data: JSON.stringify({"username": "Ed sheeran", "password": "123"}),
success: function(data) {
console.log(data);
},
error: function() {
console.log("fucking error");
}
});
后端代码:

@RestController
public class LoginController {
@PostMapping("/login")
public void login(@RequestBody Map<String, Object> map) {
System.out.println(map.get("username"));
System.out.println(map.get("password"));
}
}
3. 请求头参数以及Cookie
请求头参数和Cookie可以通过HttpServletRequest来获取。
3.1 获取请求头参数
后端代码:
@RestController
public class DemoController {
@GetMapping("/demo3")
public void demo3(HttpServletRequest request) {
System.out.println(request.getHeader("myHeader"));
for (Cookie cookie : request.getCookies()) {
if ("myCookie".equals(cookie.getName())) {
System.out.println(cookie.getValue());
}
}
}
}
二、SpringBoot默认的JSON依赖与处理
1. SpringBoot默认对JSON的处理
Spring Boot默认使用Jackson作为JSON解析框架,我们可以通过@RestController和@ResponseBody注解来简化JSON数据的返回。
1.1 实体类转换为JSON
实体类:
public class SysUser {
private String id;
private String userName;
private String password;
// getters and setters omitted for brevity
}
Controller:
@RestController
@RequestMapping("/jsonFormat1")
public class SystemUser1Controller {
@GetMapping("/user")
public SysUser getUser() {
return new SysUser("1", "小明", "xiaoming123");
}
}
2. 配置阿里巴巴fastjson
有时候我们可能会选择fastjson而不是Jackson,可以在pom.xml中添加fastjson依赖,并进行相应的配置。
2.1 pom.xml文件配置fastjson依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version1.2.76</version>
</dependency>
2.2 使用fastjson处理null值

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FastJsonConfig {
@Bean
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.WriteMapNullValue); // 保留null值
config.setDateFormat("yyyyMMdd HH:mm:ss");
converter.setFastJsonConfig(config);
return converter;
}
}
三、统一返回的数据结构
为了统一返回的数据结构,可以定义一个通用的返回结构,并在Controller中使用。
1. 定义统一的JSON结构
public class R {
private int code;
private String msg;
private Object data;
// getters and setters omitted for brevity
}
2. 改造Controller控制器
@RestController
@RequestMapping("/jsonFormat1")
public class SystemUser1Controller {
@GetMapping("/user")
public R getUser() {
SysUser user = new SysUser("1", "小明", "xiaoming123");
return new R(200, "success", user);
}
}
四、相关问题与解答栏目
问题1:如何在Spring Boot中使用fastjson代替Jackson?
答:在Spring Boot中使用fastjson代替Jackson需要在pom.xml中添加fastjson依赖,并配置FastJsonHttpMessageConverter,具体步骤如下:
1、在pom.xml文件中添加fastjson依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version1.2.76</version>
</dependency>
2、创建一个配置类,配置FastJsonHttpMessageConverter:
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FastJsonConfig {
@Bean
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.WriteMapNullValue); // 保留null值
config.setDateFormat("yyyyMMdd HH:mm:ss");
converter.setFastJsonConfig(config);
return converter;
}
}
通过以上配置,即可在项目中使用fastjson代替Jackson进行JSON数据的处理。
问题2:如何处理JSON数据格式不正确导致的异常?
答:当JSON数据格式不正确时,Spring Boot会抛出HttpMessageNotReadableException异常,解决方法如下:
1、确保前端发送的JSON数据格式正确,并且与后端Java对象匹配,如果Java对象定义了一个phoneNumber属性,那么JSON数据中也应该包含这个属性。
2、在控制器中捕获异常,进行相应的处理,可以使用@ExceptionHandler注解来处理异常:
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<String> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
return new ResponseEntity<>("Invalid JSON format: " + e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
以上内容就是解答有关“SpringBoot学习之Json数据交互的方法”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。













