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数据交互的方法”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。