美文网首页
序列化和反序列化

序列化和反序列化

作者: 盗生一 | 来源:发表于2020-09-30 15:56 被阅读0次

    @JsonDeserialize 和 @JsonSerialize 基本使用

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


    【实现方式】
    方式一:通过使用工具类,在请求进入前,或响应前对参数进行处理,然后进行封装,此方法略
    方式二:使用 @JsonDeserialize 和 @JsonSerialize 注解对在序列化和反序列化时对参数进行处理
    【Pojo 类】

    • @JsonDeserialize
      是在反序列化时,所以就是对参数进行封装,故到的是 setXxxx() 方法,所以需要将注解添加到对应的 set 方法上,若使用了 Lombok 需要自己定义相应的 set 方法。
      需要使用 using 属性指定处理参数的类,该类需要继承 JsonDeserializer 类,并重写 deserialize()。
    • @JsonSerialize
      是在序列化时,所以需要获取数据,那么需要使用到 getXxxx() 方法,故需要将注解添加到对应的 get 方法上,若使用了 Lombok 需要自己定义相应的 get 方法。
      需要使用 using 属性指定处理参数的类,该类需要继承 JsonSerializer 类,并重写 serialize()。
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Person implements Serializable {
        private static final long serialVersionUID = 4346092911489022673L;
    
        private Integer id;
        private String name;
        private Integer age;
    
        /**
         * 1 男,0 女
         */
        private Integer gender;
    
        @JsonDeserialize(using = GenderJsonDeserializer.class)
        public void setGender(Integer gender) {
            this.gender = gender;
        }
    
        @JsonSerialize(using = GenderJsonSerializer.class)
        public Integer getGender() {
            return gender;
        }
    }
    
    

    【GenderJsonDeserializer 类】

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

    @Component
    @Slf4j
    public class GenderJsonDeserializer extends JsonDeserializer {
    
        @Override
        public Integer deserialize(JsonParser p, DeserializationContext ctxt)
                throws IOException, JsonProcessingException {
    
            if (ObjectUtils.isEmpty(p)) {
                return null;
            }
    
            int gender = 0;
    
            switch (p.getText()) {
                case "男":
                    gender = 1;
                    break;
                case "女":
                    break;
                default:
                    throw new RuntimeException("传入的性别为非法字符!");
            }
    
            log.info("【 GenderJsonDeserializer.deserialize() 】  p.getText() ==> " 
                            + p.getText() + ",转换后的结果 ==> " + gender);
    
            return gender;
        }
    }
    
    

    【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

    @RestController
    @Slf4j
    public class PersonController {
        // 使用集合模拟数据库中数据存储
        private List<Person> persons = new ArrayList<>();
    
        // 用于初始化数据,@PostConstruct 注解标注的方法,在构造器执行之后自动执行,只会执行一次
        @PostConstruct
        public void init() {
            persons.add(new Person(1, "张三", 18, 1));
            persons.add(new Person(2, "李四", 33, 0));
        }
    
        @PostMapping("/save")
        public Person savePerson(@RequestBody Person person) {
            log.info("【 PersonController.savePerson() 】  person ===> " + person);
            persons.add(person);
            log.info("集合内容为 ===> " + persons);
            return person;
        }
    
        @GetMapping("/find")
        public Person findPersonById(Integer id) {
            Person p = null;
            for (Person person : persons) {
               if (person.getId().equals(id)) {
                   p = person;
                   log.info("【 PersonController.findPersonById() 】  查询结果为:person ===> " + person);
               }
            }
            return p;
        }
    }
    
    

    【测试】

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


      图片.png
    • 测试获取

    图片.png

    相关文章

      网友评论

          本文标题:序列化和反序列化

          本文链接:https://www.haomeiwen.com/subject/fxzcektx.html