当前位置: 移动技术网 > IT编程>开发语言>Java > fastjson自定义序列化竟然有这么多姿势?

fastjson自定义序列化竟然有这么多姿势?

2019年12月02日  | 移动技术网IT编程  | 我要评论

本文介绍下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等高并发分布式、大数据、机器学习等技术。
关注下方公众号即可免费领取:

java碎碎念公众号

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网