文章目录

  • 序列化
  • 反序列化
  • 在同一个class中序列化和反序列化

Spring Boot中使用@JsonComponent

@JsonComponent 是Spring boot的核心注解,使用@JsonComponent 之后就不需要手动将Jackson的序列化和反序列化手动加入ObjectMapper了。使用这个注解就够了。

序列化

假如我们有个User类,它里面有一个Color属性:

@Data
@AllArgsConstructor
public class User {private Color favoriteColor;
}

接下来我们来创建针对User的序列化组件,我们需要实现JsonSerializer接口:

@JsonComponent
public class UserJsonSerializer extends JsonSerializer<User> {@Overridepublic void serialize(User user, JsonGenerator jsonGenerator,SerializerProvider serializerProvider) throws IOException,JsonProcessingException {jsonGenerator.writeStartObject();jsonGenerator.writeStringField("favoriteColor",getColorAsWebColor(user.getFavoriteColor()));jsonGenerator.writeEndObject();}private static String getColorAsWebColor(Color color) {int r = (int) Math.round(color.getRed() * 255.0);int g = (int) Math.round(color.getGreen() * 255.0);int b = (int) Math.round(color.getBlue() * 255.0);return String.format("#%02x%02x%02x", r, g, b);}
}

在上面的类中,我们自定义了序列化的方法。接下来我们测试一下:

@JsonTest
@RunWith(SpringRunner.class)
public class UserJsonSerializerTest {@Autowiredprivate ObjectMapper objectMapper;@Testpublic void testSerialization() throws JsonProcessingException {User user = new User(Color.ALICEBLUE);String json = objectMapper.writeValueAsString(user);assertEquals("{\"favoriteColor\":\"#f0f8ff\"}", json);}
}

反序列化

同样的,我们实现JsonDeserializer接口:

@JsonComponent
public class UserJsonDeserializer extends JsonDeserializer<User> {@Overridepublic User deserialize(JsonParser jsonParser,DeserializationContext deserializationContext) throws IOException,JsonProcessingException {TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser);TextNode favoriteColor= (TextNode) treeNode.get("favoriteColor");return new User(Color.web(favoriteColor.asText()));}
}

我们看下怎么调用:

@JsonTest
@RunWith(SpringRunner.class)
public class UserJsonDeserializerTest {@Autowiredprivate ObjectMapper objectMapper;@Testpublic void testDeserialize() throws IOException {String json = "{\"favoriteColor\":\"#f0f8ff\"}"User user = objectMapper.readValue(json, User.class);assertEquals(Color.ALICEBLUE, user.getFavoriteColor());}
}

在同一个class中序列化和反序列化

@JsonComponent
public class UserCombinedSerializer {public static class UserJsonSerializer extends JsonSerializer<User> {@Overridepublic void serialize(User user, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {jsonGenerator.writeStartObject();jsonGenerator.writeStringField("favoriteColor", getColorAsWebColor(user.getFavoriteColor()));jsonGenerator.writeEndObject();}private static String getColorAsWebColor(Color color) {int r = (int) Math.round(color.getRed() * 255.0);int g = (int) Math.round(color.getGreen() * 255.0);int b = (int) Math.round(color.getBlue() * 255.0);return String.format("#%02x%02x%02x", r, g, b);}}public static class UserJsonDeserializer extends JsonDeserializer<User> {@Overridepublic User deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)throws IOException, JsonProcessingException {TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser);TextNode favoriteColor = (TextNode) treeNode.get("favoriteColor");return new User(Color.web(favoriteColor.asText()));}}
}

为了方便,我们还可以在同一个类中定义两个内部类来实现序列化和反序列化。如上所示。

本文的例子可以参考https://github.com/ddean2009/learn-springboot2/tree/master/springboot-jsoncomponent

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

更多教程请参考 flydean的博客

Spring Boot中使用@JsonComponent相关推荐

  1. 再谈Spring Boot中的乱码和编码问题

    编码算不上一个大问题,即使你什么都不管,也有很大的可能你不会遇到任何问题,因为大部分框架都有默认的编码配置,有很多是UTF-8,那么遇到中文乱码的机会很低,所以很多人也忽视了. Spring系列产品大 ...

  2. 【spring boot2】第8篇:spring boot 中的 servlet 容器及如何使用war包部署

    嵌入式 servlet 容器 在 spring boot 之前的web开发,我们都是把我们的应用部署到 Tomcat 等servelt容器,这些容器一般都会在我们的应用服务器上安装好环境,但是 spr ...

  3. Spring Boot 中使用 MongoDB 增删改查

    本文快速入门,MongoDB 结合SpringBoot starter-data-mongodb 进行增删改查 1.什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件 ...

  4. Spring Boot 中使用@Async实现异步调用,加速任务执行!

    欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...

  5. 徒手解密 Spring Boot 中的 Starter自动化配置黑魔法

    我们使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中.Starter 为我们带来了众多的自动化配置,有了这些自动化配置,我们可以不费吹灰之力就能搭建一个生产级开发环境,有的小 ...

  6. Maven中的profile和spring boot中的profile进行结合

    2019独角兽企业重金招聘Python工程师标准>>> 有一些应用,采用了spring boot和spring boot profile.然后想把maven 中的profile和sp ...

  7. Spring Boot中使用JavaMailSender发送邮件

    相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看 ...

  8. Spring Boot中Web应用的统一异常处理

    为什么80%的码农都做不了架构师?>>>    我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛 ...

  9. 解决Spring boot中读取属性配置文件出现中文乱码的问题

    解决Spring boot中读取属性配置文件出现中文乱码的问题 参考文章: (1)解决Spring boot中读取属性配置文件出现中文乱码的问题 (2)https://www.cnblogs.com/ ...

最新文章

  1. iOS网络编程-iCloud键值数据存储编程实例
  2. 28笔记本USB接口案例分析
  3. npm install -g -S -D的区别及应用场景
  4. [Java开发]打印当前路径到控制台
  5. C语言中,两整数相除,若分母为零,则会出现怎样的结果???
  6. CSDN上下标输入方法
  7. android 应用选择器的使用
  8. C#学习笔记之线程 - 使用线程
  9. sqlserver200864位下载_sql server 2008 r2中文版
  10. Composition API 使用
  11. 计算机专业所需的职业道德,浅议计算机职业道德
  12. Arduino 操作BT008蓝牙串口模块
  13. 使用pyecharts绘制各个3D图表代码示例整理和分享
  14. 印章识别--笛卡尔坐标系转换成极坐标系
  15. 嵌入式培训如何学?什么人适合转行嵌入式开发?
  16. 避免怀疑跳槽,程序员该怎么请假?
  17. JQuery Datatables Columns API 参数详细说明
  18. restcontrol 注解
  19. 软件测试专业山东大学好考吗,去山大复试跪了,谈谈我的血泪史,以资后来人...
  20. 【Activiti工作流】11.并行网关

热门文章

  1. sox+linux查录音格式,linux-使用SOX和sox FAIL格式混合音频:无法打开输入文件`audio_recorded.wav’:WAVE:找不到RIFF标头...
  2. 关于IOCP乱序的探讨
  3. rapidjson官方教程
  4. VC树控件的简单使用
  5. 双指针解决力扣两/三数之和问题
  6. 【今晚7点】:圆桌PI回归 继续聊聊开源的故事
  7. OneVPL与FFmpeg/GStreamer硬件编解码器
  8. 春天就是要搞技术啊!
  9. 全面拥抱HDR时机已到?
  10. LiveVideoStackCon 2019上海 优秀出品人与讲师