文章目录

  • 1.概述
  • 2.【需求】
  • 3.【实现方式】
    • 3.1 @JsonDeserialize
    • 3.2 @JsonSerialize
  • 4.案例
    • 4.1 实体类
    • 4.2 GenderJsonDeserializer
    • 4.3 GenderJsonSerializer
    • 4.4 controller
  • 5.【测试】
    • 5.1 测试保存,即 Controller 中的 savePerson()
    • 5.2 测试获取

1.概述

转载:@JsonDeserialize 和 @JsonSerialize 基本使用

学习 【Spring】No suitable HttpMessageConverter repsonse type
这个主要是项目中国遇到了这个问题,然后来学习一下

2.【需求】

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

3.【实现方式】

  1. 通过使用工具类,在请求进入前,或响应前对参数进行处理,然后进行封装,此方法略

  2. 使用 @JsonDeserialize 和 @JsonSerialize 注解对在序列化和反序列化时对参数进行处理
    【Pojo 类】

3.1 @JsonDeserialize

是在反序列化时,所以就是对参数进行封装,故到的是 setXxxx() 方法,所以需要将注解添加到对应的 set 方法上,若使用了 Lombok 需要自己定义相应的 set 方法。

需要使用 using 属性指定处理参数的类,该类需要继承 JsonDeserializer 类,并重写 deserialize()。

3.2 @JsonSerialize

是在序列化时,所以需要获取数据,那么需要使用到 getXxxx() 方法,故需要将注解添加到对应的 get 方法上,若使用了 Lombok 需要自己定义相应的 get 方法。

需要使用 using 属性指定处理参数的类,该类需要继承 JsonSerializer 类,并重写 serialize()。

4.案例

4.1 实体类

@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;}
}

4.2 GenderJsonDeserializer

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

@Component
@Slf4j
public class GenderJsonDeserializer extends JsonDeserializer {@Overridepublic 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;}
}

4.3 GenderJsonSerializer

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

@Component
@Slf4j
public class GenderJsonSerializer extends JsonSerializer {@Overridepublic 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("女");}}
}

4.4 controller

用于测试

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

@RestController
@Slf4j
public class PersonController {// 使用集合模拟数据库中数据存储private List<Person> persons = new ArrayList<>();// 用于初始化数据,@PostConstruct 注解标注的方法,在构造器执行之后自动执行,只会执行一次@PostConstructpublic 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;}
}

5.【测试】

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


控制台输出:

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

5.2 测试获取

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

【jackson】@JsonDeserialize 和 @JsonSerialize相关推荐

  1. jackson使用@JsonDeserialize与@JsonSerialize控制序列化与反序列化使用的实际类型

    1.简介 默认情况下,序列化时会获取对象的实际类型,然后根据可见性规则,获取对象以及其父类的所有属性进行序列化 默认情况下,反序列化时,如果使用的对象类型.属性类型不是最终类型,而是接口或者抽象类型, ...

  2. Jackson 注解 -- 类型转换(序列化,反序列化)、私有字段

    如果输入输出 JSON 时需要类型转换,我们可以使用注解 @JsonDeserialize 和 @JsonSerialize package shangbo.jackson.demo17;import ...

  3. @JsonSerialize 使用:注解方式 实现条件判断属性值、条件修改属性值

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 数据库中是 1.0 记录性别. 预期效果为:当查到属性值为 1 时,就给序列化后的 json ...

  4. Json解析工具Jackson(使用注解)

    接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解 @JsonIgnoreProperties ...

  5. 让Jackson JSON生成的数据包含的中文以unicode方式编码

    本文出处:http://blog.csdn.net/chaijunkun/article/details/8257209,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  6. java jackson unicode_如何让Jackson JSON生成的数据包含的中文以unicode方式编码

    我们都知道,Jackson JSON以高速.方便和灵活著称.之前的文章中介绍过使用注解的形式来规定如何将一个对象序列化成JSON的方法,以及如何将一个JSON数据反序列化到一个对象上.但是美中不足的一 ...

  7. 解决:Jackson反序列化Java内部类失败(序列化后的识别码为LinkedHashMap,而非内部类本身)

    问题描述 先看实体类: import com.fasterxml.jackson.annotation.*; import lombok.Data; import org.jeecg.common.s ...

  8. Jackson 自定义序列化和反序列化

    目录 1. 创建序列化类 2. 创建反序列化类 3. 实体类字段添加注解 4. 反序列操作 5. 序列化操作 1. 创建序列化类 继承JsonSerializer或者StdSerializer,添加泛 ...

  9. JAVA对象通过jackson转成json格式,属性名首字母变成小写的解决方法

    2019独角兽企业重金招聘Python工程师标准>>> java代码对象如下: package com.evideostb.billsystem.module.model;impor ...

最新文章

  1. REST接口设计规范
  2. 生成对抗网络(GAN)的理论与应用完整入门介绍
  3. XML实现Android动画效果anim
  4. nginx高性能WEB服务器系列之九--nginx运维故障日常解决方案
  5. 关于OpenGL环境配置问题(2015)
  6. 判断程序是否处于调试状态
  7. Java黑皮书课后题第4章:4.16(随机字符)编写一个程序,使用Math.random()方法显示一个随机的大写字母
  8. c语言迭代法求平方根_求平方根问题 (C++ 实现)
  9. System类+Math类+Arrays类
  10. 【数据结构与算法】浅谈队列的应用
  11. 文件操作(上传,下载,限制)
  12. PHP MySQL基础知识
  13. 双侧检验的p值和单侧检验_【单侧检验和双侧检验的区别】_怎么检验_如何检验-大众养生网...
  14. 【编程珠玑】读书笔记 第五章 编程小事
  15. 手把手教你学dsp_大咖问答第13期:如何掌握DSP设计?顾卫钢博士在线为你解答...
  16. html坦克游戏,HTML5实现经典坦克大战坦克乱走还能发出一个子弹
  17. Barefoot P4加速SDN
  18. docker 运维shipyard 构建以及操作
  19. NodeJs+mongoose实现搜索功能
  20. 36 数字组合(Combination Sum)

热门文章

  1. 特斯拉上调电动汽车预订订金:由100美元上调至250美元
  2. “阿里女员工被侵害”案最新进展:两人涉嫌强制猥亵
  3. 互联网“收割”网瘾父母
  4. 苹果:2020全年App Store阻止了超15亿美元潜在诈骗交易
  5. 苹果股价爆涨10%:股票拆分,利好散户
  6. 16小时31分12秒!2019天猫双11成交额超2135亿元,超越2018年全天成交额
  7. 10月15日发布!谷歌Pixel 4系列或将全系支持5G
  8. 雷军:小米MIX Alpha不是折叠屏手机,将会很震撼
  9. 小米618战报出炉!三平台狂揽156项第一
  10. 探探被安卓市场下架 官方回应:深入开展整改