fastjson自定义序列化竟然有这么多姿势?
本文介绍下fastjson自定义序列化的各种操作。
一、什么是fastjson?
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
二、如何使用
添加如下maven依赖即可:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
三、fastjson默认序列化
fastjson入口类是com.alibaba.fastjson.JSON,一个最简单默认的序列化代码如下:
User user = new User();
String str= JSON.toJSONString(user);
四、如何自定义序列化
fastjson支持多种方式自定义序列化。
1.使用序列化属性SerializerFeature
SerializerFeature常用属性如下:
名称 | 含义 |
---|---|
WriteNonStringKeyAsString | 如果key不为String,则转换为String |
WriteNonStringValueAsString | 如果value不为String,则转换为String |
WriteMapNullValue | 输出为空的字段 |
WriteNullStringAsEmpty | String为null时输出"" |
WriteNullNumberAsZero | number为null时输出0 |
WriteDateUseDateFormat | 修改日期格式,yyyy-MM-dd |
常用的属性介绍完了,咱们先来看下效果,新建一个User类,代码如下:
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer age;
private String name;
private String sex;
private Date createDate;
private Map<Integer, Integer> dataMap;
}
运行类代码如下:
public static void main(String[] args) {
User user = new User();
user.setId(1000);
user.setName("Java碎碎念");
user.setCreateDate(new Date());
Map<Integer, Integer> datamap = new HashMap<>();
datamap.put(1, 100);
datamap.put(2, 200);
user.setDataMap(datamap);
System.out.println("默认序列化结果:\n" + JSON.toJSONString(user));
System.out.println("指定WriteNonStringKeyAsString序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNonStringKeyAsString));
System.out.println("指定WriteNonStringValueAsString序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNonStringValueAsString));
System.out.println("指定WriteMapNullValue序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteMapNullValue));
System.out.println("指定WriteNullStringAsEmpty序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty));
System.out.println("指定WriteNullNumberAsZero序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNullNumberAsZero));
System.out.println("指定WriteDateUseDateFormat序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat));
}
运行结果:
默认序列化结果:
{"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
指定WriteNonStringKeyAsString序列化结果:
{"createDate":1575038247084,"dataMap":{"1":100,"2":200},"id":1000,"name":"Java碎碎念"}
指定WriteNonStringValueAsString序列化结果:
{"createDate":1575038247084,"dataMap":{1:"100",2:"200"},"id":"1000","name":"Java碎碎念"}
指定WriteMapNullValue序列化结果:
{"age":null,"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念","sex":null}
指定WriteNullStringAsEmpty序列化结果:
{"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念","sex":""}
指定WriteNullNumberAsZero序列化结果:
{"age":0,"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
指定WriteDateUseDateFormat序列化结果:
{"createDate":"2019-11-29 22:37:27","dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
2.使用JSONField
JSONField是fastjson的一个注解,可以用在字段上,也可以用在getter/setter方法上面。
2.1 JSONField注解
注解主要内容如下:
package com.alibaba.fastjson.annotation;
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才支持
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
2.2 JSONField注解配置方式
- 配置在字段上
@Data
public class User implements Serializable {
@JSONField(name = "_id")
private Integer id;
}
- 配置在getter/setter上
@JSONField(name="_id")
public Integer getId() {
return id;
}
@JSONField(name="_id")
public void setId(Integer id) {
this.id = id;
}
- 使用format配置日期格式化
@JSONField(format="yyyy-MM-dd")
private Date createDate;
- 使用serialize/deserialize指定字段不序列化
@JSONField(serialize=false)
private Integer age;
- 使用ordinal指定字段的顺序
@JSONField(ordinal = 2)
private String name;
下面直接修改代码看下效果,修改后User类如下:
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@JSONField(name = "_id", ordinal = 3)
private Integer id;
@JSONField(serialize = false, ordinal = 4)
private Integer age;
@JSONField(ordinal = 1)
private String name;
@JSONField(ordinal = 2)
private String sex;
@JSONField(format = "yyyy-MM-dd", ordinal = 5)
private Date createDate;
}
测试类运行结果如下:
默认序列化结果:
{"age":18,"createDate":1575006127174,"id":1000,"name":"Java碎碎念"}
使用JSONField后序列化结果:
{"name":"Java碎碎念","_id":1000,"createDate":"2019-11-29"}
通过运行结果可以看到,使用@JSONField注解变化如下:
- id序列化后变成了_id
- createDate格式化为yyyy-MM-dd
- 序列化后字段的顺序跟ordinal指定的一致
- 设置了serialize=false的字段age没有序列化
结果和预期一致,说明自定义序列化没有问题,到此fastjson自定义序列化的功能已经全部实现,有问题欢迎留言沟通哦!
推荐阅读
1.SpringBoot2.0整合集成WebSocket,实现后端数据实时推送!
4.一分钟带你学会利用mybatis-generator自动生成代码!
限时领取免费Java相关资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高并发分布式、大数据、机器学习等技术。
关注下方公众号即可免费领取:
fastjson自定义序列化竟然有这么多姿势?的更多相关文章
- FastJson 自定义Serialize、Parser
FastJson 自定义Serialize.Parser 今天在处理Json反序列化时,在C#传过来的JSON字符串中枚举类型为int类型,FastJson对于枚举的处理有两种类型,一种是字符串一种是 ...
- .Net Core 自定义序列化格式
序列化对大家来说应该都不陌生,特别是现在大量使用WEBAPI,JSON满天飞,序列化操作应该经常出现在我们的代码上. 而我们最常用的序列化工具应该就是Newtonsoft.Json,当然你用其它工具类 ...
- Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称
手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数 ...
- 基础命名空间:序列化_自定义序列化 System.Runtime.Serialization
( (From Msdn) 自定义序列化是控制类型的序列化和反序列化的过程,通过控制序列化,可以确保序列化兼容性.换而言之,在不中断类型核心功能的情况下,可在类型的不同版本之间序列化和反序列化. 重 ...
- Java Serializable接口(序列化)理解及自定义序列化
1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...
- WeihanLi.Redis自定义序列化及压缩方式
WeihanLi.Redis自定义序列化及压缩方式 Intro WeihanLi.Redis 是基于 StackExchange.Redis 的扩展,提供了一些常用的业务组件和对泛型的更好支持,默认使 ...
- Effective Java 第三版—— 87. 考虑使用自定义序列化形式
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- SpringBoot Redis使用fastjson进行序列化
在使用spring-data-redis,默认情况下是使用org.springframework.data.redis.serializer.JdkSerializationRedisSerializ ...
- kafka自定义序列化器
<kafka权威指南> Customer.java public class Customer { private int customId; private String custome ...
随机推荐
- Xbim.GLTF源码解析(一):简介
原创作者:flowell,转载请标明出处:https://www.cnblogs.com/flowell/p/10838972.html 简介 Xbim.GLTF是将IFC文件转换成GLTF文件的一个 ...
- 列表[‘hello’ , ‘python’ ,’!’ ] 用多种方法拼接,并输出’hello python !’ 以及join()在python中的用法简介
列表[‘hello’ , ‘python’ ,’!’ ] 用多种方法拼接,并输出’hello python !’ 使用字符串链接的四种方法都可以创建 字符串拼接一共有四种方法,也可以应用到列表的拼接中 ...
- 最全的access2013教程 access 2010教程 access 2007教程 Access 2003教程
最全的access2013教程 access 2010教程 access 2007教程 Access 2003教程 都在这个access中国网站里 http://www.office-cn.net/o ...
- 再整理:Visual Studio Code(vscode)下的通用C语言环境搭建
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/czlhxm/p/11794743.ht ...
- ssh WARNING:REMOTE HOST IDENTIFICATION HAS CHANGED(警告:远程主机标识已更改)
ssh 192.168.1.88 出现以下警告: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOT ...
- C/C++顺序数据结构——动态数组测试
这是一篇顺序表数据结构——动态数组的测试, 实现 //初始化数组 //插入 //根据位置删除 //根据值删除 //查找 //打印 //释放动态数组的内存 //清空数组 //获得动态数组容量 //获得动 ...
- No such application config! Please add dubbo:application
SpringBoot运行找不到application.properties配置文件 运行springBoot项目启动报错:java.lang.IllegalStateException: No suc ...
- 小白学 Python(18):基础文件操作
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- csps模拟测试70
又炸了,T1没开$long long$,炸掉$50pts$,昨天因为SB错误挂掉$100pts$. 我kuku了,以后细心点吧.
- P4409 [ZJOI2006]皇帝的烦恼(20190922B)(乱搞)
考场历程十分艰辛啊... 第一题没切掉,还浪费了很长时间,就是一个裸的最小生成树,但是因为可恶的distance为关键字莫名其妙查错了10min.... 本题先乱搞了一下,过了样例 然后看第三题,可写 ...