10、SpringBoot—— JSON解析库
-
JSON简介
- 概念
- JSON,是一种轻量级的数据交换格式。所谓数据交交换格式,指的是前端和后端之间传递数据的格式
- 所谓的“轻量级”是与XML相比,JSON是轻量级的
- 概念
-
JSON解析库 —— Jackson
-
概念
- 基于Java语言,开源的JSON解析库,SpringBoot默认使用的JSON解析库
- 功能丰富、安全可靠并且具有较好的兼容性,让开发人员可以很方便的实现JavaBean和JSON数据的相互转换
-
核心API
- 概念
- SpringBoot默认使用的Jackson具有两个常用类,它们分别是JsonNode节点类和ObjectMapper映射器类,请自行查阅相关API(太多了,哥哥)
- 概念
-
把JavaBean转为JSON数据
-
示例
dto.ErrorMessage:
public class ErrorMessage { private String message; private Integer code; public static ErrorMessage PASSWORD_ERROR = new ErrorMessage("账号或密码错误",100); public static ErrorMessage NOT_FOUND = new ErrorMessage("访问的资源不存在",404); // Getter、Setter和Constructor }
controller.ErrorController:
@RestController public class ErrorController { @Autowired ObjectMapper objectMapper; @RequestMapping("/login") public String login(String username, String password) throws JsonProcessingException { if("admin".equals(username) && "123456".equals(password)) return "登录成功"; if("admin".equals(username)) return objectMapper.writeValueAsString(ErrorMessage.PASSWORD_ERROR); return objectMapper.writeValueAsString(ErrorMessage.NOT_FOUND); } }
-
-
把Json数据转换成JavaBean
-
概念
- 其实就是预先写好一个实体类,该实体类的字段和json数据的“键”一一对应
-
示例
pojo.Employee:
public class Employee { private Integer id; // 员工编号 private String name; // 员工姓名 private Set<String> time = new HashSet<String>(); // 打卡时间 // Getter、Setter、Constructor和toString }
controller.WorkerController:
@RestController public class WorkerController { @Autowired private ObjectMapper objectMapper; @RequestMapping("/employee") public String list(@RequestBody String json) throws JsonProcessingException { Employee e = objectMapper.readValue(json,Employee.class); System.out.println(e); return "ok"; } }
-
-
SpringBoot自动把JavaBean转成JSON数据
-
概念
- @ResponseBody注解默认就是会将java对象转成json字符串然后返回(当然,原本是字符串的,不用管)
- 由于@RestController注解集成了@ResponseBody,所以被@RestController标注的类的方法都会默认上一条的行为
-
示例
config.Mycomponent:
@Component public class Mycomponent { @Bean public Employee getEmployee(){ Employee employee = new Employee(1,"kaiven"); Set<String> time = new HashSet<>(); time.add("2022-01-01 12:00:00"); time.add("2022-01-02 12:00:00"); employee.setTime(time); return employee; } }
controller.TestController:
@RestController public class TestController { @Autowired Employee employee; @RequestMapping("/test") public Employee test() { return employee; } }
-
对于json字符串的增删改查,虽然JackSon提供了大量的API,但是FastJson更加方便
-
-
-
JSON解析库 —— FastJson
-
概念
- FastJson是由阿里巴巴技术团队推出的开源的JSON解析库。因为其语法非常简洁,所以受到许多程序开发者的青睐
- 总的来说,虽然相较于JackSon而言,略逊色一点,但是奈何其简单呢
-
添加FastJson依赖
pol.xml:
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.51</version> </dependency>
-
对象转Json(序列化)
pojo.Student:
public class Student { private Integer id; private String name; private Integer age; public Student() {} // Getter、Setter、Constructor和toString }
controller.TestController:
@RestController public class TestController { @RequestMapping("/test") public String test() { Student student = new Student(1,"kaiven",20); return JSON.toJSONString(student); } }
-
Json转对象(反序列化)
controller.TestController:
@RequestMapping("/json2object") public String test2(@RequestBody String json) { Student student = JSON.parseObject(json, Student.class); System.out.println(student); return "ok"; }
-
@JSONField注解
-
概念
- 该注解可以让开发人员定制序列化规则,也就是修改对象与Json数据的映射关系
- Field注解可以用于声明类、字段和或方法
-
为字段设置别名
-
给属性设置别名
@JSONField(name = "code") private Integer id;
-
给字段的Getter/Setter方法上定义别名
@JSONField(name = "code") public Integer getId() { return id; } @JSONField(name = "code") public void setId(Integer id) { this.id = id; }
-
不管采用哪种方式,都会让Student对象的id属性值以“code”字段名予以显示
-
-
设置日期格式
-
概念
- 如果@JSONField标注的是日期类型的字段,就可以定义该字段序列化时的日期格式
-
示例
@JSONField(format = "yyyy-MM-dd") private LocalDate birthday;
-
-
设置被忽略的属性
-
概念
- @JSONField注解可以定义哪些字段不会被转换成JSON数据
-
示例
@JSONField(serialize = false) private Integer id;
-
-
设置字段在json中的顺序
- 这个就有点累赘了
-
-
对JSON数据的增、删、改、查
-
查询数据
-
概念
- FastJson为每一种数据类型提供了一个get方法,通过get系列方法即可查询字段或指定索引对应的值
-
示例
String json = """ { "name":"kaiven", "age":20, "gender":"male", "array":["hhhhh"], "obj":{ "name":"lucy", } } """;
@Test void test01() { // 解析出整个“大括号” JSONObject root = JSON.parseObject(json); String name = (String) root.get("name"); int age = root.getIntValue("age"); String gender = (String) root.get("gender"); JSONArray array = root.getJSONArray("array"); JSONObject obj = root.getJSONObject("obj"); System.out.println(name); System.out.println(age); System.out.println(gender); System.out.println(array); System.out.println(obj); }
-
-
增加数据
-
概念
- 对象节点使用put方法增加字段,数组节点使用add方法增加元素
-
示例
@Test void test02() { JSONObject root = JSON.parseObject(json); root.put("hobby","唱,跳,rap,篮球"); root.getJSONArray("array").add("这是一个元素"); root.getJSONObject("obj").put("age",30); System.out.println(root.toJSONString()); }
-
-
修改数据
-
概念
- 对象节点使用put方法修改字段,数组节点使用set方法修改元素
-
示例
@Test void test03() { JSONObject root = JSON.parseObject(json); root.put("name","jack"); root.getJSONArray("array").set(0,"hahaha"); root.getJSONObject("obj").put("name","kaiven"); System.out.println(root.toJSONString()); }
-
-
删除数据
-
概念
- 对象节点和数组节点都是用remove方法删除数据
-
示例
@Test void test04() { JSONObject root = JSON.parseObject(json); root.remove("age"); root.getJSONArray("array").remove(0); root.getJSONObject("obj").remove("name"); System.out.println(root.toJSONString()); }
-
-
-