• @JsonDeserialize 和 @JsonSerialize 基本使用


    转载自:https://blog.csdn.net/yage124/article/details/107321339

    【需求】
    在前端性别显示“男 / 女”,而数据库中存储的是“1 / 0”,对应的 Pojo 也是使用的 Integer 类型,如何实现?

    【实现方式】
    方式一:通过使用工具类,在请求进入前,或响应前对参数进行处理,然后进行封装,此方法略

    方式二:使用 @JsonDeserialize 和 @JsonSerialize 注解对在序列化和反序列化时对参数进行处理

    【Pojo 类】

    • @JsonDeserialize
      是在反序列化时,所以就是对参数进行封装,故到的是 setXxxx() 方法,所以需要将注解添加到对应的 set 方法上,若使用了 Lombok 需要自己定义相应的 set 方法。
      需要使用 using 属性指定处理参数的类,该类需要继承 JsonDeserializer 类,并重写 deserialize()。

    • @JsonSerialize
      是在序列化时,所以需要获取数据,那么需要使用到 getXxxx() 方法,故需要将注解添加到对应的 get 方法上,若使用了 Lombok 需要自己定义相应的 get 方法。
      需要使用 using 属性指定处理参数的类,该类需要继承 JsonSerializer 类,并重写 serialize()。

     1 @Data
     2 @NoArgsConstructor
     3 @AllArgsConstructor
     4 public class Person implements Serializable {
     5     private static final long serialVersionUID = 4346092911489022673L;
     6 
     7     private Integer id;
     8     private String name;
     9     private Integer age;
    10 
    11     /**
    12      * 1 男,0 女
    13      */
    14     private Integer gender;
    15 
    16     @JsonDeserialize(using = GenderJsonDeserializer.class)
    17     public void setGender(Integer gender) {
    18         this.gender = gender;
    19     }
    20 
    21     @JsonSerialize(using = GenderJsonSerializer.class)
    22     public Integer getGender() {
    23         return gender;
    24     }
    25 }

    【GenderJsonDeserializer 类】

      其作用是处理参数,按照规则封装到指定的属性中,通过 p.getText() 获取参数。

     1 @Component
     2 @Slf4j
     3 public class GenderJsonDeserializer extends JsonDeserializer {
     4 
     5     @Override
     6     public Integer deserialize(JsonParser p, DeserializationContext ctxt)
     7             throws IOException, JsonProcessingException {
     8             
     9         if (ObjectUtils.isEmpty(p)) {
    10             return null;
    11         }
    12 
    13         int gender = 0;
    14 
    15         switch (p.getText()) {
    16             case "男":
    17                 gender = 1;
    18                 break;
    19             case "女":
    20                 break;
    21             default:
    22                 throw new RuntimeException("传入的性别为非法字符!");
    23         }
    24 
    25         log.info("【 GenderJsonDeserializer.deserialize() 】  p.getText() ==> " 
    26                         + p.getText() + ",转换后的结果 ==> " + gender);
    27 
    28         return gender;
    29     }
    30 }

    【GenderJsonSerializer 类】

      其作用是处理属性,按照规则封装到指定的参数中,通过value 获取属性,通过 gen.writeXxx() 方法写出参数。

    @Component
    @Slf4j
    public class GenderJsonSerializer extends JsonSerializer {
        @Override
        public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) 
                throws IOException {
                
            log.info("【 GenderJsonSerializer.serialize() 】  value ==> " + value);
            if (value.equals(1)) {
                gen.writeString("男");
            } else if (value.equals(0)) {
                gen.writeString("女");
            }
        }
    }

    【PersonController 类】

      用于测试
            @PostConstruct 基本使用可以查看:https://blog.csdn.net/yage124/article/details/107322556

     1 @RestController
     2 @Slf4j
     3 public class PersonController {
     4     // 使用集合模拟数据库中数据存储
     5     private List<Person> persons = new ArrayList<>();
     6     
     7     // 用于初始化数据,@PostConstruct 注解标注的方法,在构造器执行之后自动执行,只会执行一次
     8     @PostConstruct
     9     public void init() {
    10         persons.add(new Person(1, "张三", 18, 1));
    11         persons.add(new Person(2, "李四", 33, 0));
    12     }
    13 
    14     @PostMapping("/save")
    15     public Person savePerson(@RequestBody Person person) {
    16         log.info("【 PersonController.savePerson() 】  person ===> " + person);
    17         persons.add(person);
    18         log.info("集合内容为 ===> " + persons);
    19         return person;
    20     }
    21 
    22     @GetMapping("/find")
    23     public Person findPersonById(Integer id) {
    24         Person p = null;
    25         for (Person person : persons) {
    26            if (person.getId().equals(id)) {
    27                p = person;
    28                log.info("【 PersonController.findPersonById() 】  查询结果为:person ===> " + person);
    29            }
    30         }
    31         return p;
    32     }
    33 }

    【测试】

    • 测试保存,即 Controller 中的 savePerson()

      

      控制台输出:

      

    1 【 GenderJsonDeserializer.deserialize() 】  p.getText() ==> 男,转换后的结果 ==> 1
    2 
    3 【 PersonController.savePerson() 】  person ===> Person(id=3, name=王五, age=88, gender=1)
    4 
    5 集合内容为 ===> [Person(id=1, name=张三, age=18, gender=1),
    6                              Person(id=2, name=李四, age=33, gender=0), 
    7                              Person(id=3, name=王五, age=88, gender=1)]
    8                              
    9 【 GenderJsonSerializer.serialize() 】  value ==> 1
    • 测试获取

      

      控制台输出:

     1 【 PersonController.findPersonById() 】 查询结果为:person ===> Person(id=2, name=李四, age=33, gender=0) 2 3 【 GenderJsonSerializer.serialize() 】 value ==> 0 

  • 相关阅读:
    连接查询
    使用聚合函数查询
    mysql 查询数据
    Mysql的基本操作
    MySQL的数据类型
    Mysql简介及安装教程
    客户端-服务端
    configparser模块
    反射
    class_method和static_method
  • 原文地址:https://www.cnblogs.com/zhangzhongkun/p/16249427.html
Copyright © 2020-2023  润新知