10、SpringBoot—— JSON解析库

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());
          }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值