Spring Boot中使用@JsonComponent
文章目录
- 序列化
- 反序列化
- 在同一个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相关推荐
- 再谈Spring Boot中的乱码和编码问题
编码算不上一个大问题,即使你什么都不管,也有很大的可能你不会遇到任何问题,因为大部分框架都有默认的编码配置,有很多是UTF-8,那么遇到中文乱码的机会很低,所以很多人也忽视了. Spring系列产品大 ...
- 【spring boot2】第8篇:spring boot 中的 servlet 容器及如何使用war包部署
嵌入式 servlet 容器 在 spring boot 之前的web开发,我们都是把我们的应用部署到 Tomcat 等servelt容器,这些容器一般都会在我们的应用服务器上安装好环境,但是 spr ...
- Spring Boot 中使用 MongoDB 增删改查
本文快速入门,MongoDB 结合SpringBoot starter-data-mongodb 进行增删改查 1.什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件 ...
- Spring Boot 中使用@Async实现异步调用,加速任务执行!
欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...
- 徒手解密 Spring Boot 中的 Starter自动化配置黑魔法
我们使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中.Starter 为我们带来了众多的自动化配置,有了这些自动化配置,我们可以不费吹灰之力就能搭建一个生产级开发环境,有的小 ...
- Maven中的profile和spring boot中的profile进行结合
2019独角兽企业重金招聘Python工程师标准>>> 有一些应用,采用了spring boot和spring boot profile.然后想把maven 中的profile和sp ...
- Spring Boot中使用JavaMailSender发送邮件
相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看 ...
- Spring Boot中Web应用的统一异常处理
为什么80%的码农都做不了架构师?>>> 我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛 ...
- 解决Spring boot中读取属性配置文件出现中文乱码的问题
解决Spring boot中读取属性配置文件出现中文乱码的问题 参考文章: (1)解决Spring boot中读取属性配置文件出现中文乱码的问题 (2)https://www.cnblogs.com/ ...
最新文章
- iOS网络编程-iCloud键值数据存储编程实例
- 28笔记本USB接口案例分析
- npm install -g -S -D的区别及应用场景
- [Java开发]打印当前路径到控制台
- C语言中,两整数相除,若分母为零,则会出现怎样的结果???
- CSDN上下标输入方法
- android 应用选择器的使用
- C#学习笔记之线程 - 使用线程
- sqlserver200864位下载_sql server 2008 r2中文版
- Composition API 使用
- 计算机专业所需的职业道德,浅议计算机职业道德
- Arduino 操作BT008蓝牙串口模块
- 使用pyecharts绘制各个3D图表代码示例整理和分享
- 印章识别--笛卡尔坐标系转换成极坐标系
- 嵌入式培训如何学?什么人适合转行嵌入式开发?
- 避免怀疑跳槽,程序员该怎么请假?
- JQuery Datatables Columns API 参数详细说明
- restcontrol 注解
- 软件测试专业山东大学好考吗,去山大复试跪了,谈谈我的血泪史,以资后来人...
- 【Activiti工作流】11.并行网关
热门文章
- sox+linux查录音格式,linux-使用SOX和sox FAIL格式混合音频:无法打开输入文件`audio_recorded.wav’:WAVE:找不到RIFF标头...
- 关于IOCP乱序的探讨
- rapidjson官方教程
- VC树控件的简单使用
- 双指针解决力扣两/三数之和问题
- 【今晚7点】:圆桌PI回归 继续聊聊开源的故事
- OneVPL与FFmpeg/GStreamer硬件编解码器
- 春天就是要搞技术啊!
- 全面拥抱HDR时机已到?
- LiveVideoStackCon 2019上海 优秀出品人与讲师