fastjson总结

2023-11-12

** fastjson 版本: 1.2.36 **

主要 API

序列化 API (String JSON.toJSONString(Object …)) : 将对象序列化为 json 字符串
反序列化 API (T JSON.parseObject(String str, …)) 将 json 字符串序列化为对象.

JSON.toJSONString(Object …)

在这里插入图片描述
有多个重载方法,不同的参数对序列化过程进行控制。可以看到,主要是通过三个参数来对序列化进行干预的,SerializeConfig 这是序列化全局配置, SerializeFilter 序列化过滤器,SerializeFeature 这是fastjson自定义的特征枚举变量,定制序列化过程。

SerializeFeature

为什么先说这个,因为这个应用范围最广,能够覆盖大部分的序列化要求。
这是一个枚举类,列举了一系列序列化的参数。
在这里插入图片描述在这里插入图片描述

package com.alibaba.fastjson.serializer;
/**
 * 
 */
public enum SerializerFeature {
    QuoteFieldNames,  // 输出 Key 时是否使用双引号, 默认 true
    UseSingleQuotes,  // 输出key时使用单引号而不是双引号, 默认 false
    WriteMapNullValue,  // 是否输出值为 null 的字段, 默认 false, 默认不输出值为 null 的字段
    WriteEnumUsingToString, // Enum 输出其toString() 值,可以重写 toString 来自定义输出形式,但是这样做会带来一个问题,对应的反序列化使用的Enum的静态方法valueof可能无法识别自行生成的toString(),导致反序列化出错
    WriteEnumUsingName,    // Enum 输出其name() 值,默认 true, 如果需要序列化其 ordinal() 值, 禁用掉该选项,如何禁用具体代码见后文
    UseISO8601DateFormat, // Date使用ISO8601格式输出,默认为 false
    WriteNullListAsEmpty,  // List 字段如果为 null,输出 [] 而不是 null,默认 false
    WriteNullStringAsEmpty, // String 字段如果为 null, 输出 "",而不是 null,默认 false
    WriteNullNumberAsZero, // 数值字段如果为 null, 输出0而不是null,默认 false
    WriteNullBooleanAsFalse,  // Boolean字段如果为 null, 输出 false而不是 null,默认 false
    SkipTransientField, // 字段如果加了@Transient 注解,则不序列化该字段, 默认 true
    SortField,  // 按字段名称排序后输出, 默认 true, 会按字段名称字母排序。 
    /** @deprecated */
    @Deprecated
    WriteTabAsSpecial,
    PrettyFormat,   // 是否格式化输出
    WriteClassName, // 序列化时写入类型信息,默认 false。反序列化时需用到
    DisableCircularReferenceDetect, //消除对同一对象循环引用的问题,默认 false
    WriteSlashAsSpecial,  // 对斜杠 / 进行转义, 转义成 \/
    BrowserCompatible,
    WriteDateUseDateFormat,  // 全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
    NotWriteRootClassName,
    /** @deprecated */
    DisableCheckSpecialChar, //一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
    BeanToArray,
    WriteNonStringKeyAsString, 
    NotWriteDefaultValue,  //  不写入默认值, 默认 false
    BrowserSecure,
    IgnoreNonFieldGetter,  // 忽略不是类字段对应的getter 方法 ,默认 false
    WriteNonStringValueAsString,
    IgnoreErrorGetter,
    WriteBigDecimalAsPlain,
    MapSortField;
}

还是举例说明吧
以老掉牙的 User 类举例

public class User {
    private String name;
    private String sex;
    private String address;
    private String defVal = "hello";  // 有默认值
    private String trans;          // get 方法加了@Transient 注解
    private int age;
    private Long seconds;
    private BigDecimal salary;
    private Boolean flag;
    private Date birth;
    private List<String> roles;
    private Map<String,Object> map;
    private Week week;
    private String nullVal;

    public enum Week {
        Mon(1), Tue(2), Wed(3), Thu(4), Fir(5), Sat(6), Sun(7);
        private int val;

        Week(Integer val) {
            this.val = val;
        }

        public int getVal() {
            return val;
        }
    }
	// 这是额外定义的getTest()方法,类中并没有 test 字段。
    public String getTest() {
        return "test";
    }

    @Transient
    public String getTrans() {
        return trans;
    }

    public void setTrans(String trans) {
        this.trans = trans;
    }
 ... 
 其余 getter/setter 方法

基础序列化;

@Test
    public void test() {
        User user = new User();
        user.setName("张三");
        user.setAge(12);
        user.setSex("1");
        user.setAddress("杭州123号\t\n\r \"京城18号\"");
        user.setWeek(User.Week.Fir);

        String userStr = JSON.toJSONString(user);
        System.out.println(userStr);
    }
    输出结果:
{"address":"杭州123号\t\n\r \"京城18号\"","age":12,"defVal":"hello","name":"张三","sex":"1","test":"test","week":"Fir"}

User类的 seconds, roles, nullVal 等值为 null 的字段没有输出来,说明默认情况下值为 null 的字段是不序列化的。defVal 在定义的初始化为hello,也是输出了的。另外额外定义的getTest方法,fastjson就会序列化test字段出来,哪怕类中没有 test Field。可以用 SerializeFeature.IgnoreNonFieldGetter 忽略掉这些不是Field 字段的 getter 方法。

WriteMapNullValue 是否输出值为 null 的字段

因为fastjson默认是不序列化值为 null 的字段的,加了这个选项,那么值为 null 的字段也会输出。

 String userStr = JSON.toJSONString(user, SerializerFeature.WriteMapNullValue);
 System.out.println(userStr);
输出结果:
{"address":"杭州123号\t\n\r \"京城18号\"","age":12,"birth":null,"defVal":"hello","flag":null,"map":null,"name":"张三","nullVal":null,"roles":null,"salary":null,"seconds":null,"sex":"1","test":"test","week":"Fir"}

值为 null 的 字段也输出了。

WriteNullListAsEmpty, WriteNullStringAsEmpty,,WriteNullNumberAsZero,WriteNullBooleanAsFalse

直接上代码,具体含义上面也说了。

String userStr = JSON.toJSONString(user, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty,
            SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullBooleanAsFalse);
 // 另外也可以这么写: String userStr = JSON.toJSONString(user, SerializerFeature.WRITE_MAP_NULL_FEATURES);
	WRITE_MAP_NULL_FEATURES 相当于这四个特性。
	
 System.out.println(userStr);
输出:

{"address":"杭州123号\t\n\r \"京城18号\"","age":12,"birth":null,"defVal":"hello","flag":false,"map":null,"name":"张三","nullVal":"","roles":[],"salary":0,"seconds":0,"sex":"1","test":"test","week":"Fir"}

可以看到roles序列化化为 [], salay序列化为 0,flag 序列化为false, nullVal序列化为 “” (空字符串),

WriteEnumUsingToString 和 WriteEnumUsingName

WriteEnumUsingToString 会使用 enum 的 toString() 返回值来序列化枚举类型。例如在上例中,我们在enum Week 中重写 toString() 方法。因为enum默认的 toString 方法就是输出其 name 值,如果不重写 toString() 方法,其输出就是其 name 值

public enum Week {
        Mon(1), Tue(2), Wed(3), Thu(4), Fir(5), Sat(6), Sun(7);
        private int val;

        Week(Integer val) {
            this.val = val;
        }

        public int getVal() {
            return val;
        }

        @Override
        public String toString() {
            return this.ordinal() + ":" + this.name();
        }

    }
String userStr = JSON.toJSONString(user, SerializerFeature.WriteEnumUsingToString);
输出: 	
{"address":"杭州123号\t\n\r \"京城18号\"","age":12,"defVal":"hello","name":"张三","sex":"1","test":"test","week":"4:Fir"}

week字段的输出变成了 『4:Fir』

WriteEnumUsingName 默认为 true, fastjson 默认输出枚举类型的 name 值,如果想要输出其 ordinal 值, 将其值设置为 false 即可。怎么设置呢,这里就要用到SerializeFeature 的 config 方法了。看代码

int feature = SerializerFeature.config(JSON.DEFAULT_GENERATE_FEATURE, SerializerFeature.WriteEnumUsingName, false);
String userStr = JSON.toJSONString(user, feature);
System.out.println(userStr);

输出:
{"address":"杭州123号\t\n\r \"京城18号\"","age":12,"defVal":"hello","name":"张三","sex":"1","test":"test","week":4}

week值变成了4, ordinal值是从 0 开始算起的,所以 Fri 的 ordinal 值为4。

PrettyFormat 格式化输出

默认情况下,输出的 json 只有一行。这个特性可以让输出进行一些格式化操作,什么意思呢,输出会有多行,有缩进,有换行。

String userStr = JSON.toJSONString(user, SerializerFeature.PrettyFormat);
输出: 
{
	"address":"杭州123号\t\n\r \"京城18号\"",
	"age":12,
	"defVal":"hello",
	"name":"张三",
	"sex":"1",
	"test":"test",
	"week":"Fir"
}

WriteSlashAsSpecial 对 / 进行转义输出

user.setAddress("杭州123号\t\n\r / /\"京城18号\"");
String userStr = JSON.toJSONString(user);
String userStr1 = JSON.toJSONString(user, SerializerFeature.WriteSlashAsSpecial);
输出:
{"address":"杭州123号\t\n\r / /\"京城18号\"","age":12,"defVal":"hello","name":"张三","sex":"1","test":"test","week":"Fir"}
{"address":"杭州123号\t\n\r \/ \/\"京城18号\"","age":12,"defVal":"hello","name":"张三","sex":"1","test":"test","week":"Fir"}

默认情况下, / 是原样输出的,加了WriteSlashAsSpecial ,/ 被转义输出为 /

IgnoreNonFieldGetter

忽略类中非 field 字段的 getter 方法。我们看默认情况下,User 类中有一个
getTest()方法,在序列化结果中,出现了一个 test 字段,
{"address":"杭州123号\t\n\r \"京城18号\"","age":12,"defVal":"hello","name":"张三","sex":"1","test":"test","week":"Fir"}
但是在 User 类中并没有一个 test 属性字段,默认情况下,fastjson 也会把这样的字段序列化出来。加了 IgnoreNonFieldGetter 之后,这样不是类 field 字段对应的getter 方法会被忽略,也就不会序列化出多余的字段了。

String userStr1 = JSON.toJSONString(user, SerializerFeature.IgnoreNonFieldGetter);
输出: 
{"address":"杭州123号\t\n\r \"京城18号\"","age":12,"defVal":"hello","name":"张三","sex":"1","week":"Fir"}

test 字段不见了。

WriteDateUseDateFormat,

全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

 JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
 user.setBirth(new Date());
 String s = JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat);
 输出: 
 {"address":"杭州123号\t\n\r \"京城18号\"","age":12,"birth":"2019-07-09","defVal":"hello","name":"张三","sex":"1","test":"test","week":"Fir"}

birth字段输出为: 2019-07-09。这种方式属于全局修改,所有的日子字段都会转换成相应的格式,如果只想对某次序列化的日期做处理,可以改用
JSON.toJSONStringWithDateFormat(user,"yyyy-MM-dd");

QuoteFieldNames, UseSingleQuotes

QuoteFieldNames特性表示序列化时将 key 用双引号包裹,默认为 true.

输出:
{"address":"杭州123号\t\n\r \"京城18号\"","age":12,"defVal":"hello","name":"张三","sex":"1","test":"test","week":"Fir"}

UseSingleQuotes 输出key时使用单引号而不是双引号, 默认 false.

代码:

 String userStr1 = JSON.toJSONString(user, SerializerFeature.UseSingleQuotes);
 输出:
{'address':'杭州123号\t\n\r "京城18号"','age':12,'defVal':'hello','name':'张三','sex':'1','test':'test','week':'Fir'}

key 现在是用单引号包裹的。如果想让 key 既不用双引号括起来,也不用单引号括起来。那么将 QuoteFieldNames 设置为 false。
代码:

int feature = SerializerFeature.config(JSON.DEFAULT_GENERATE_FEATURE, SerializerFeature.QuoteFieldNames, false);
输出:
{address:"杭州123号\t\n\r \"京城18号\"",age:12,defVal:"hello",name:"张三",sex:"1",test:"test",week:"Fir"}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fastjson总结 的相关文章

随机推荐

  • SSL单双向认证

    一 TLS SSL协议 HTTPS协议是在HTTP TLS SSL协议组成的可进行加密传输 身份认证的网络协议 旨在保证数据传输过程中的保密性 完整性和安全性 HTTPS在HTTP和TCP之间 增加了TLS SSL协议 正是通过TLS协议
  • Property xxx was accessed during render but is not defined on instance

    vue3 x版本在结合element plus使用如果使用了表单元素以及v model指令会在控制台看到类似的警告 虽然不影响js运行 但是对于强迫症玩家难受的不行 下面我们来看一下这个问题是如何产生的 应该怎么解决 原因 vue3 x版本
  • HDFS加密区加密过程

    HDFS加密区 encryption zone 中的每个文件都使用唯一的数据加密密钥 data encryption key DEK 进行加密 明文DEK被区域级加密密钥 加密区密钥 encryption zone key EZK 加密成加
  • 灵感爆发:An/flash 影片剪辑动画播放一遍后,摆脱paly()的控制

    有一个影片剪辑我只想让他播放一次就停下来 但是我的播放按钮 就一个命令 this play 现在有个矛盾 播放按钮和暂停按钮都在 暂停在影片剪辑动画的中间还好 但是不小心暂停在最后一帧 在播放就会从头 播放按钮只有一个功能就是从当前帧继续播
  • MySQL高阶语句(三)

    一 NULL值 在 SQL 语句使用过程中 经常会碰到 NULL 这几个字符 通常使用 NULL 来表示缺失 的值 也就是在表中该字段是没有值的 如果在创建表时 限制某些字段不为空 则可以使用 NOT NULL 关键字 不使用则默认可以为空
  • Webpack 4.X 配置cdn加载资源

    众所周知 SPA单页应用 首次访问需要加载近全部资源 从而导致首页渲染速度很慢 继而 出现很多性能优化方案 图片 资源懒加载 减少http请求 减小请求资源大小 减少dom操作避免触发回流重绘 gzip压缩 cdn加载等等 今天 我们就具体
  • 使用OpenSSL搭建CA

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 SSL TLS 1 机密性 数据加密 对称加密 2 完整性 保证数据不会被篡改 或是因为数据传输丢失 单向加密 提高特征码 附加到数据后 3 可靠性 二 概述 如何实现
  • ubuntu 18.04 校园网连接问题:MAC物理地址不匹配。

    ifconfig belong to net tools net tools have been removed in Ubuntu 18 04 so we need to install net tools by hand Notice
  • Stable Diffusion实现AI绘画,尝试向实际业务迈进...

    前置 由于处于学习初期 懂得较少以及可能会出现理解错误等情况 故而文章仅供参考学习使用 旨在分享知识 共同学习 不能作为依据 如有错误 感谢指出 文章主题分为两部分 学习部分也就理论知识 实践部分主要包括问题及解决方案 一 Stable D
  • less-loader 报错

    当vue页面中初次使用了 lang less 通常会报错 信息比如 Module not found Error Can t resolve xxxxxxxx node modules less loader dist cjs js 此时需
  • 多元线性回归模型可视化

    绘制平面图 绘制 房价 与 房价面积 及 房间数量 之间关系的散点图 import numpy as np import matplotlib pyplot as plt from mpl toolkits mplot3d import A
  • 通俗理解数字签名,数字证书和https

    前言 最近在开发关于PDF合同文档电子签章的功能 大概意思就是在一份PDF合同上签名 盖章 使其具有法律效应 签章有法律效应必须满足两个条件 能够证明签名 盖章者是谁 无法抵赖 PDF合同在签章后不能被更改 在纸质合同中 由于签名字迹的不可
  • 【渗透测试笔记】之【内网渗透——CS流量隐蔽】

    文章目录 1 修改端口特征 2 修改证书特征 2 配置CDN 3 生成自定义配置文件 4 效果演示 1 修改端口特征 vim teamserver 将默认端口修改 Dcobaltstrike server port 54321 2 修改证书
  • C++入门——命名空间

    文章目录 前言 命名空间的定义 命名空间的使用 前言 在c c 中 会有变量 函数以及后面的类 这些名称都要存在于局部的 可能会有冲突 所以使用命名空间的意义就是 对标识符的名称进行本地化 以避免命名冲突或者名字的污染 namespace关
  • WSL 2 网络配置

    文章目录 WSL 2 访问局域网内设备 WSL 2 访问本机 Windows WSL 2 访问非本机 Windows 设备 局域网内设备访问 WSL 2 本机 Windows 访问 WSL 2 非本机 Windows 设备访问 WSL 2
  • 支持向量机matlab代码程序_多核支持向量机原理及实现

    了解非线性支持向量机模型后 应该对支持向量机的原理与核技巧都有掌握 本文在传统非线性支持向量机基础上向大家介绍多核支持向量机 这里就不对支持向量机原理与核函数花费太多笔墨了 主要介绍将单核支持向量机转换为多核支持向量机的思想 原理介绍完之后
  • Some collections were archived because you’ve reached the shared requests limits.错误解决

    今天打开我的postman 发现我的一个collection不见了 左下角出现一个提示 Some collections were archived because you ve reached the shared requests li
  • win11安装WSA(安卓子系统)教程

    1 更新到最新版win11 截止2021年10月23日 最新版本号是22000 282 2 启用Windows沙盒和Windows虚拟机监控程序平台 控制面板打开程序与功能 启用或关闭Windows功能 找到这两个选项 打钩确定 等待安装
  • 机器学习实战第十四章-利用SVD简化数据

    一 什么是SVD SVD Singular Value Decomposition 奇异值分解 基本知识如下图所示 其中U和V都可以作为高维转低维的转换矩阵将原始高维冗余数据转换到一个低维无冗余语义空间中 从而实现数据的降维 SVD的应用
  • fastjson总结

    fastjson 版本 1 2 36 主要 API 序列化 API String JSON toJSONString Object 将对象序列化为 json 字符串 反序列化 API T JSON parseObject String st