转载自: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