请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

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

[复制链接]
查看: 24|回复: 0

8248

主题

8248

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
24754
发表于 2019-12-2 16:39 | 显示全部楼层 |阅读模式
本文先容下fastjson自界说序列化的各类操纵。
一、什么是fastjson?

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

增加以下maven依靠即可:
  1.     com.alibaba    fastjson    1.2.60
复制代码
三、fastjson默许序列化

fastjson进口类是com.alibaba.fastjson.JSON,一个最简单默许的序列化代码以下:
  1. User user = new User();String str= JSON.toJSONString(user);
复制代码
四、怎样自界说序列化

fastjson支持多种方式自界说序列化。
1.操纵序列化属性SerializerFeature

SerializerFeature常用属性以下:
称号寄义WriteNonStringKeyAsString假如key不为String,则转换为StringWriteNonStringValueAsString假如value不为String,则转换为StringWriteMapNullValue输出为空的字段WriteNullStringAsEmptyString为null时输出""WriteNullNumberAsZeronumber为null时输出0WriteDateUseDateFormat点窜日期格式,yyyy-MM-dd常用的属性先容完了,我们先来看下成果,新建一个User类,代码以下:
  1. @Datapublic 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 dataMap;}
复制代码
运转类代码以下:
  1. public static void main(String[] args) {        User user = new User();        user.setId(1000);        user.setName("Java碎碎念");        user.setCreateDate(new Date());        Map 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));    }
复制代码
运转成果:
  1. 默许序列化成果:{"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注解
注解首要内容以下:
  1. 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注解设置方式

  • 设置在字段上
  1. @Datapublic class User implements Serializable {    @JSONField(name = "_id")    private Integer id;}
复制代码

  • 设置在getter/setter上
  1.     @JSONField(name="_id")    public Integer getId() {        return id;    }    @JSONField(name="_id")    public void setId(Integer id) {        this.id = id;    }
复制代码

  • 操纵format设置日期格式化
  1.     @JSONField(format="yyyy-MM-dd")    private Date createDate;
复制代码

  • 操纵serialize/deserialize指定字段不序列化
  1.     @JSONField(serialize=false)    private Integer age;
复制代码

  • 操纵ordinal指定字段的顺序
  1. @JSONField(ordinal = 2)    private String name;
复制代码
下面间接点窜代码看下成果,点窜后User类以下:
  1. @Datapublic 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;}
复制代码
测试类运转成果以下:
  1. 默许序列化成果:{"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自界说序列化居然有这么多姿势?  热门消息 463242-20191202134005571-890825328


免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 淄博新闻网-淄博日报 淄博晚报 淄博财经新报 掌中淄博 淄博专业新闻资讯发布网站 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表