通过 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 |
本文来自博客园,作者:CharyGao,转载请注明原文链接:https://www.cnblogs.com/Chary/articles/18279447