本文介绍下fastjson自定义序列化的各种操作。

一、什么是fastjson?

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

二、如何使用

添加如下maven依赖即可:

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.60</version>
  5. </dependency>

三、fastjson默认序列化

fastjson入口类是com.alibaba.fastjson.JSON,一个最简单默认的序列化代码如下:

  1. User user = new User();
  2. 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类,代码如下:

  1. @Data
  2. public class User implements Serializable {
  3. private static final long serialVersionUID = 1L;
  4. private Integer id;
  5. private Integer age;
  6. private String name;
  7. private String sex;
  8. private Date createDate;
  9. private Map<Integer, Integer> dataMap;
  10. }

运行类代码如下:

  1. public static void main(String[] args) {
  2. User user = new User();
  3. user.setId(1000);
  4. user.setName("Java碎碎念");
  5. user.setCreateDate(new Date());
  6. Map<Integer, Integer> datamap = new HashMap<>();
  7. datamap.put(1, 100);
  8. datamap.put(2, 200);
  9. user.setDataMap(datamap);
  10. System.out.println("默认序列化结果:\n" + JSON.toJSONString(user));
  11. System.out.println("指定WriteNonStringKeyAsString序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNonStringKeyAsString));
  12. System.out.println("指定WriteNonStringValueAsString序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNonStringValueAsString));
  13. System.out.println("指定WriteMapNullValue序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteMapNullValue));
  14. System.out.println("指定WriteNullStringAsEmpty序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty));
  15. System.out.println("指定WriteNullNumberAsZero序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNullNumberAsZero));
  16. System.out.println("指定WriteDateUseDateFormat序列化结果:\n" + JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat));
  17. }

运行结果:

  1. 默认序列化结果:
  2. {"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
  3. 指定WriteNonStringKeyAsString序列化结果:
  4. {"createDate":1575038247084,"dataMap":{"1":100,"2":200},"id":1000,"name":"Java碎碎念"}
  5. 指定WriteNonStringValueAsString序列化结果:
  6. {"createDate":1575038247084,"dataMap":{1:"100",2:"200"},"id":"1000","name":"Java碎碎念"}
  7. 指定WriteMapNullValue序列化结果:
  8. {"age":null,"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念","sex":null}
  9. 指定WriteNullStringAsEmpty序列化结果:
  10. {"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念","sex":""}
  11. 指定WriteNullNumberAsZero序列化结果:
  12. {"age":0,"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
  13. 指定WriteDateUseDateFormat序列化结果:
  14. {"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注解

注解主要内容如下:

  1. package com.alibaba.fastjson.annotation;
  2. public @interface JSONField {
  3. // 配置序列化和反序列化的顺序,1.1.42版本之后才支持
  4. int ordinal() default 0;
  5. // 指定字段的名称
  6. String name() default "";
  7. // 指定字段的格式,对日期格式有用
  8. String format() default "";
  9. // 是否序列化
  10. boolean serialize() default true;
  11. // 是否反序列化
  12. boolean deserialize() default true;
  13. }

2.2 JSONField注解配置方式

  • 配置在字段上
  1. @Data
  2. public class User implements Serializable {
  3. @JSONField(name = "_id")
  4. private Integer id;
  5. }
  • 配置在getter/setter上
  1. @JSONField(name="_id")
  2. public Integer getId() {
  3. return id;
  4. }
  5. @JSONField(name="_id")
  6. public void setId(Integer id) {
  7. this.id = id;
  8. }
  • 使用format配置日期格式化
  1. @JSONField(format="yyyy-MM-dd")
  2. private Date createDate;
  • 使用serialize/deserialize指定字段不序列化
  1. @JSONField(serialize=false)
  2. private Integer age;
  • 使用ordinal指定字段的顺序
  1. @JSONField(ordinal = 2)
  2. private String name;

下面直接修改代码看下效果,修改后User类如下:

  1. @Data
  2. public class User implements Serializable {
  3. private static final long serialVersionUID = 1L;
  4. @JSONField(name = "_id", ordinal = 3)
  5. private Integer id;
  6. @JSONField(serialize = false, ordinal = 4)
  7. private Integer age;
  8. @JSONField(ordinal = 1)
  9. private String name;
  10. @JSONField(ordinal = 2)
  11. private String sex;
  12. @JSONField(format = "yyyy-MM-dd", ordinal = 5)
  13. private Date createDate;
  14. }

测试类运行结果如下:

  1. 默认序列化结果:
  2. {"age":18,"createDate":1575006127174,"id":1000,"name":"Java碎碎念"}
  3. 使用JSONField后序列化结果:
  4. {"name":"Java碎碎念","_id":1000,"createDate":"2019-11-29"}

通过运行结果可以看到,使用@JSONField注解变化如下:

  • id序列化后变成了_id
  • createDate格式化为yyyy-MM-dd
  • 序列化后字段的顺序跟ordinal指定的一致
  • 设置了serialize=false的字段age没有序列化

结果和预期一致,说明自定义序列化没有问题,到此fastjson自定义序列化的功能已经全部实现,有问题欢迎留言沟通哦!

推荐阅读

1.SpringBoot2.0整合集成WebSocket,实现后端数据实时推送!

2.一分钟带你了解下MyBatis的动态SQL!

3.一分钟带你了解下Spring Security!

4.一分钟带你学会利用mybatis-generator自动生成代码!

5.手把手带你实战下Spring的七种事务传播行为

限时领取免费Java相关资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高并发分布式、大数据、机器学习等技术。

关注下方公众号即可免费领取:

fastjson自定义序列化竟然有这么多姿势?的更多相关文章

  1. FastJson 自定义Serialize、Parser

    FastJson 自定义Serialize.Parser 今天在处理Json反序列化时,在C#传过来的JSON字符串中枚举类型为int类型,FastJson对于枚举的处理有两种类型,一种是字符串一种是 ...

  2. .Net Core 自定义序列化格式

    序列化对大家来说应该都不陌生,特别是现在大量使用WEBAPI,JSON满天飞,序列化操作应该经常出现在我们的代码上. 而我们最常用的序列化工具应该就是Newtonsoft.Json,当然你用其它工具类 ...

  3. Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称

    手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数 ...

  4. 基础命名空间:序列化_自定义序列化 System.Runtime.Serialization

    (  (From Msdn) 自定义序列化是控制类型的序列化和反序列化的过程,通过控制序列化,可以确保序列化兼容性.换而言之,在不中断类型核心功能的情况下,可在类型的不同版本之间序列化和反序列化. 重 ...

  5. Java Serializable接口(序列化)理解及自定义序列化

      1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...

  6. WeihanLi.Redis自定义序列化及压缩方式

    WeihanLi.Redis自定义序列化及压缩方式 Intro WeihanLi.Redis 是基于 StackExchange.Redis 的扩展,提供了一些常用的业务组件和对泛型的更好支持,默认使 ...

  7. Effective Java 第三版—— 87. 考虑使用自定义序列化形式

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  8. SpringBoot Redis使用fastjson进行序列化

    在使用spring-data-redis,默认情况下是使用org.springframework.data.redis.serializer.JdkSerializationRedisSerializ ...

  9. kafka自定义序列化器

    <kafka权威指南> Customer.java public class Customer { private int customId; private String custome ...

随机推荐

  1. Vuforia添加虚拟按键

    AR虚拟按键为真实识别图上的按键,通过按键可以实现真实与虚拟之间的按键交流 (一)添加按键 点击target,打开advance,添加虚拟按键,即可在此target下添加虚拟按键 注:虚拟按键无法旋转 ...

  2. fenby C语言 P23

    #include <stdio.h> int main(){ int i,max,a[5]={10,5,20,31,4}; max=a[0]; for(i=0;i<5;i++) if ...

  3. 透明度设置opacity

    透明度设置opacity属性 示例 <!DOCTYPE html> <html> <head> <style> div { background-col ...

  4. Linux文件同步工具之rsync

    学习背景 1.最近公司的项目在使用jenkins做自动化构建,因为jenkins在构建时是比较耗性能的,便单独使用了一台服务器做构建服务器.但是个人觉得这样成本过高,单独拿一台服务器来构建并且该服务器 ...

  5. 你编写的Java代码是咋跑起来的?

    如果你是一名 Java 开发人员,你肯定指定 Java 代码有很多种不同的运行方式.比如说可以在开发工具(IDEA.Eclipse等)中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至 ...

  6. 【MySQL】MySQL 8.0.X的安装与卸载命令

    1.请读者自行下载MySQL Server https://dev.mysql.com/downloads/mysql/ 2.解压.zip文件 将mysql-8.0.12-winx64.zip解压到 ...

  7. 用node实现发送邮箱验证码

    首先,你需要注册一个支持发送的邮箱,我注册是网易邮箱,然后配置smtp. 然后,创建一个node项目,输入npm install nodemailer --save安装邮件依赖. 接着创建一个文件(s ...

  8. 树上神奇 逆 逆序对(我的叫法)hh的小纸条 重中之重!!!!!

    HH是一位十分爱好数学的大佬,尤其喜爱数数,一天百无聊赖的他写下了一个1-N的排列,并且在小纸条上记下了每个数前面有多少个数比他小,但HH不小心忘记了这个排列.现在只有当时记下的小纸条,现在请你还原出 ...

  9. MapReduce任务提交源码分析

    为了测试MapReduce提交的详细流程.需要在提交这一步打上断点: F7进入方法: 进入submit方法: 注意这个connect方法,它在连接谁呢?我们知道,Driver是作为客户端存在的,那么客 ...

  10. acm经验(转)

    先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生涯. 总共参加了四场比赛:区域赛一银(2013长春)一铜(2013杭州)一铁(2012金华 ...