本文介绍下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入口类是com.alibaba.fastjson.json,一个最简单默认的序列化代码如下:
user user = new user(); string str= json.tojsonstring(user);
fastjson支持多种方式自定义序列化。
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碎碎念"}
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; }
@jsonfield(name="_id") public integer getid() { return id; } @jsonfield(name="_id") public void setid(integer id) { this.id = id; }
@jsonfield(format="yyyy-mm-dd") private date createdate;
@jsonfield(serialize=false) private integer age;
@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
结果和预期一致,说明自定义序列化没有问题,到此fastjson自定义序列化的功能已经全部实现,有问题欢迎留言沟通哦!
推荐阅读
1.springboot2.0整合集成websocket,实现后端数据实时推送!
4.一分钟带你学会利用mybatis-generator自动生成代码!
限时领取免费java相关资料,涵盖了java、redis、mongodb、mysql、zookeeper、spring cloud、dubbo/kafka、hadoop、hbase、flink等高并发分布式、大数据、机器学习等技术。
关注下方公众号即可免费领取:
如对本文有疑问, 点击进行留言回复!!
springcloud中feign调用处理mybatis-plus Ipage反序列化问题。
Flume 史上最全面的大数据学习第十篇(一) 别再说不知道flume是什么了
网友评论