通过 Features 配置序列化和反序列化的行为

1. Feature 介绍

在 fastjson 2.x 中,有两个 Feature,分别用来配置序列化和反序列化的行为。

  • JSONWriter.Feature 配置序列化的行为
  • JSONReader.Feature 配置反序列化的行为

2. 在 JSON 的 toJSONString 和 parse 方法中使用 Feature

2.1 在 JSON 的 toJSONString 方法中使用 JSONWriter.Feature

Bean bean = ...;
JSON.toJSONString(bean, JSONWriter.Feature.WriteNulls); // 输出对象中值为null的字段

2.2 在 JSON 的 parse 方法中使用 JSONReader.Feature

String jsonStr = ...;
JSON.parseObject(jsonStr, JSONReader.Feature.UseBigDecimalForDoubles); // 将小数数值读取为double

3. 在 JSONField 和 JSONType 上配置 features

class Model {
    @JSONField(serializeFeatures = JSONWriter.Feature.BrowserCompatible)
    public long value;
}
***

4. JSONReader.Feature 介绍

JSONReader.Feature 介绍
FieldBased 基于字段反序列化,如果不配置,会默认基于 public 的 field 和 getter 方法序列化。配置后,会基于非 static 的 field(包括 private)做反序列化。在 fieldbase 配置下会更安全
IgnoreNoneSerializable 反序列化忽略非 Serializable 类型的字段
SupportArrayToBean 支持数据映射的方式
InitStringFieldAsEmpty 初始化 String 字段为空字符串””
SupportAutoType 支持自动类型,要读取带”@type” 类型信息的 JSON 数据,需要显式打开 SupportAutoType
SupportSmartMatch 默认下是 camel case 精确匹配,打开这个后,能够智能识别 camel/upper/pascal/snake/Kebab 五中 case
UseNativeObject 默认是使用 JSONObject 和 JSONArray,配置后会使用 LinkedHashMap 和 ArrayList
SupportClassForName 支持类型为 Class 的字段,使用 Class.forName。为了安全这个是默认关闭的
IgnoreSetNullValue 忽略输入为 null 的字段
UseDefaultConstructorAsPossible 尽可能使用缺省构造函数,在 fieldBase 打开这个选项没打开的时候,会可能用 Unsafe.allocateInstance 来实现
UseBigDecimalForFloats 默认配置会使用 BigDecimal 来 parse 小数,打开后会使用 Float
UseBigDecimalForDoubles 默认配置会使用 BigDecimal 来 parse 小数,打开后会使用 Double
ErrorOnEnumNotMatch 默认 Enum 的 name 不匹配时会忽略,打开后不匹配会抛异常
TrimString 对读取到的字符串值做 trim 处理
ErrorOnNotSupportAutoType 遇到 AutoType 报错(缺省是忽略)
DuplicateKeyValueAsArray 重复 Key 的 Value 不是替换而是组合成数组
AllowUnQuotedFieldNames 支持不带双引号的字段名
NonStringKeyAsString 非 String 类型的 Key 当做 String 处理
Base64StringAsByteArray 将 byte [] 序列化为 Base64 格式的字符串

5. JSONWriter.Feature 介绍

JSONWriter.Feature 介绍
FieldBased 基于字段序列化,如果不配置,会默认基于 public 的 field 和 getter 方法序列化。配置后,会基于非 static 的 field(包括 private)做序列化。
IgnoreNoneSerializable 序列化忽略非 Serializable 类型的字段
BeanToArray 将对象序列为 [101,”XX”] 这样的数组格式,这样的格式会更小
WriteNulls 序列化输出空值字段
BrowserCompatible 在大范围超过 JavaScript 支持的整数,输出为字符串格式
NullAsDefaultValue 将空置输出为缺省值,Number 类型的 null 都输出为 0,String 类型的 null 输出为”“,数组和 Collection 类型的输出为 []
WriteBooleanAsNumber 将 true 输出为 1,false 输出为 0
WriteNonStringValueAsString 将非 String 类型的值输出为 String,不包括对象和数据类型
WriteClassName 序列化时输出类型信息
NotWriteRootClassName 打开 WriteClassName 的同时,不输出根对象的类型信息
NotWriteHashMapArrayListClassName 打开 WriteClassName 的同时,不输出类型为 HashMap/ArrayList 类型对象的类型信息,反序列结合 UseNativeObject 使用,能节省序列化结果的大小
NotWriteDefaultValue 当字段的值为缺省值时,不输出,这个能节省序列化后结果的大小
WriteEnumsUsingName 序列化 enum 使用 name
WriteEnumUsingToString 序列化 enum 使用 toString 方法
IgnoreErrorGetter 忽略 setter 方法的错误
PrettyFormat 格式化输出
ReferenceDetection 打开引用检测,这个缺省是关闭的,和 fastjson 1.x 不一致
WriteNameAsSymbol 将字段名按照 symbol 输出,这个仅在 JSONB 下起作用
WriteBigDecimalAsPlain 序列化 BigDecimal 使用 toPlainString,避免科学计数法
UseSingleQuotes 使用单引号
MapSortField 对 Map 中的 KeyValue 按照 Key 做排序后再输出。在有些验签的场景需要使用这个 Feature
WriteNullListAsEmpty 将 List 类型字段的空值序列化输出为空数组”[]”
WriteNullStringAsEmpty 将 String 类型字段的空值序列化输出为空字符串””
WriteNullNumberAsZero 将 Number 类型字段的空值序列化输出为 0
WriteNullBooleanAsFalse 将 Boolean 类型字段的空值序列化输出为 false
NotWriteEmptyArray 数组类型字段当 length 为 0 时不输出
WriteNonStringKeyAsString 将 Map 中的非 String 类型的 Key 当做 String 类型输出
ErrorOnNoneSerializable 序列化非 Serializable 对象时报错
WritePairAsJavaBean 将 Apache Common 包中的 Pair 对象当做 JavaBean 序列化
BrowserSecure 浏览器安全,将会’<’ ‘>’ ‘(‘ ‘)’字符做转义输出
WriteLongAsString 将 Long 序列化为 String
WriteEnumUsingOrdinal 序列化 Enum 使用 Ordinal,缺省是 name
WriteThrowableClassName 序列化 Throwable 时带上类型信息
LargeObject 这个是一个保护措施,是为了防止序列化有循环引用对象消耗过大资源的保护措施。
UnquoteFieldName 不带引号输出 Key
NotWriteSetClassName 当打开 WriteClassName 时又不想输出 Set 的类型信息,使用这个 Feature
NotWriteNumberClassName 当打开 WriteClassName 时又不想输出 Number 的类型信息,比如 L/S/B/F/D 这种后缀,使用这个 Feature

通过 Features 配置序列化和反序列化的行为 | fastjson2