本文介绍下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,实现后端数据实时推送!

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. scrapy爬取京东iPhone11评论(一)

    咨询行业中经常接触到文本类信息,无论是分词做词云图,还是整理编码分析用,都非常具有价值. 本文将记录使用scrapy框架爬取京东IPhone11评论的过程,由于一边学习一边实践,更新稍慢请见谅. 1. ...

  2. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  3. Mysql数据一般问题

    数据插入中文全部变为???问题: 1.停止Mysql服务: 2.修改C:\Program Files (x86)\MySQL\MySQL Server 5.5\My.ini default-chara ...

  4. CSPS模拟 49

    连续退步2333 我怎么这么不稳啊2333 看看人家大敛,天天AK 考后改了改sb错误就变40+80+100了... 但愿我的实力还在? T1 养fa 拿到题心想,这次一定把T1切了 开始研究这个见了 ...

  5. 微信小程序如何解析html内容

    最近项目上遇到在微信小程序里需要显示新闻内容,新闻内容是通过接口读取的服务器中的富文本内容,是html格式的,小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过w ...

  6. 开源 ERP 系统 GoodERP

    如果你有一个苹果,我也有一个苹果,彼此交换后,你我还是一人一个苹果,但是如果你有一个想法,我有一个想法,彼此交换后,你我就都有两个想法,三个人呢?一百个人呢? 使用openobject框架 重写全部功 ...

  7. introduce new products

    Today's the day. I'm giving you the heads up. Our company is rolling up its new line of cell phones. ...

  8. 你知道MySQL中的主从延迟吗?

    前言 在一个MySQL主备关系中,每个备库接受主库的binlog并执行. 正常情况下,只要主库执行更新生成所有的binlog,都可以传到备库并被正常的执行,这样备库就能够达到跟主库一样的状态,这就是最 ...

  9. php swoole异步处理mysql

    php swoole异步处理mysql <pre>//创建websocket服务器对象,监听0.0.0.0:9509端口//异步测试$ws = new swoole_websocket_s ...

  10. PHP获取PHP执行的时间

    php获取PHP执行的时间 <pre> //程序运行时间 $starttime = explode(' ',microtime()); //代码区域 //程序运行时间 $endtime = ...