@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 

posted @ 2022-05-09 15:33  ZZKZS  阅读(1134)  评论(0编辑  收藏  举报
/*鼠标跟随效果*/