有道无术,术尚可求,有术无道,止于术。
本系列 Jackson 版本 2.17.0
源码地址:https://gitee.com/pearl-organization/study-jaskson-demo
1. 前言
除了使用注解的方式,Jackson
还提供了很多Feature
特征枚举类,用于定制序列化\反序列化行为,接下来的几篇会详细介绍这些特征。
2. 简介
2.1 JacksonFeature
JacksonFeature
是jackson-core
模块提供的特性顶级接口,源码说明如下:
public interface JacksonFeature {
// 检查此功能是否默认启用
boolean enabledByDefault();
// 获取特征掩码
int getMask();
// 根据掩码查询该特性是否启用
boolean enabledIn(int flags);
}
JacksonFeature
的子类和实现类如下:
2.1.1 FormatFeature
FormatFeature
接口从名字上很好理解,用于声明数据格式特征:
public interface FormatFeature extends JacksonFeature {
boolean enabledByDefault();
int getMask();
boolean enabledIn(int var1);
}
FormatFeature
有两个实现类:
-
JsonWriteFeature
:JsonToken
写入特性枚举类,用于替代JsonGenerator.Feature
-
JsonReadFeature
:JsonToken
读取特性枚举类,用于替代JsonParser.Feature
2.1.2 DatatypeFeature
DatatypeFeature
接口从名字上很好理解,用于声明特定的数据类型特征:
public interface DatatypeFeature extends JacksonFeature {
// 用于高效存储和索引的内部索引
int featureIndex();
}
DatatypeFeature
有两个实现类:
-
EnumFeature
: 处理与java.lang.Enum
相关的特性枚举类 -
JsonNodeFeature
:处理与com.fasterxml.jackson.databind.JsonNode
(JSON
数据的读取和构造)相关的特性枚举类
2.1.3 直接实现类
除了FormatFeature
和DatatypeFeature
两个接口外,还提供了很多直接实现的类:
-
StreamReadCapability、StreamWriteCapability
:JsonParser、JsonGenerator
在给定的格式读写时,提供一组特性配置 -
JavaTimeFeature
:jackson-datatype-jsr310
模块提供的用于Java
时间的特性枚举(不属于三大核心模块,这里不讲解) -
StreamReadFeature、StreamWriteFeature
:JsonParser、JsonGenerator
在无关数据格式读写时,提供一组特性配置,用于替代JsonParser.Feature
、JsonGenerator.Feature
-
JsonFactory.Feature
:JsonFactory
特性枚举,同时作用于JsonParser、JsonGenerator
2.3 ConfigFeature
ConfigFeature
是jackson-databind
提供的接口,专用于数据绑定时提供一组特征。
public interface ConfigFeature {
boolean enabledByDefault();
int getMask();
boolean enabledIn(int var1);
}
ConfigFeature
的实现类如下:
实现类简要说明:
-
MapperFeature
:映射绑定相关特性 -
SerializationFeature
、DeserializationFeature
:序列化\反序列化相关特征
2.4 JsonGenerator.Feature、JsonParser.Feature
JsonGenerator.Feature
和JsonParser.Feature
是JsonParser、JsonGenerator
的内部类,它们没有实现任何接口,用于配置读写时的特性配置。
例如JsonGenerator.Feature
中,可以看到很多特性都标记了过时,推荐使用其替代品 JsonWriteFeature
和JsonReadFeature
,统一规范,更加灵活和强大。
public static enum Feature {
AUTO_CLOSE_TARGET(true),
AUTO_CLOSE_JSON_CONTENT(true),
FLUSH_PASSED_TO_STREAM(true),
/** @deprecated */
@Deprecated
QUOTE_FIELD_NAMES(true),
/** @deprecated */
@Deprecated
QUOTE_NON_NUMERIC_NUMBERS(true),
/** @deprecated */
@Deprecated
ESCAPE_NON_ASCII(false),
/** @deprecated */
@Deprecated
WRITE_NUMBERS_AS_STRINGS(false),
WRITE_BIGDECIMAL_AS_PLAIN(false),
STRICT_DUPLICATE_DETECTION(false),
IGNORE_UNKNOWN(false),
/** @deprecated */
@Deprecated
USE_FAST_DOUBLE_WRITER(false),
/** @deprecated */
@Deprecated
WRITE_HEX_UPPER_CASE(true),
ESCAPE_FORWARD_SLASHES(false);
2.5 JsonFormat.Feature
@JsonFormat
注解也声明了一个内部特征类,用于专门配置使用@JsonFormat
注解时的相关特性。
public static enum Feature {
// 重写`DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY`,允许将数组、集合反序列化为单个值
ACCEPT_SINGLE_VALUE_AS_ARRAY,
// 重写`MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES`,允许大小写不敏感,只影响反序列化,不影响序列化
ACCEPT_CASE_INSENSITIVE_PROPERTIES,
// 重写`DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL`,允许将未知枚举值解析为空值
READ_UNKNOWN_ENUM_VALUES_AS_NULL,
// 重写`DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE`,允许忽略未知枚举值,并通过指定预定义值
READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE,
// 重写`DeserializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS`,允许将时间戳转换为纳秒
READ_DATE_TIMESTAMPS_AS_NANOSECONDS,
// 重写`MapperFeature.ACCEPT_CASE_INSENSITIVE_VALUES`,允许区分大小写匹配(某些)属性值,只影响反序列化,不影响序列化
ACCEPT_CASE_INSENSITIVE_VALUES,
// 重写`SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS`,序列化纳秒为时间
WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,
// 重写`SerializationFeature.WRITE_DATES_WITH_ZONE_ID`,序列化带地区的时间
WRITE_DATES_WITH_ZONE_ID,
// 重写`SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED`,只有单个元素的集合、数组序列化时,不包含 []
WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED,
// 重写`SerializationFeature.WRITE_SORTED_MAP_ENTRIES`,启强制在序列化之前对{@link java.util.Map}键进行排序
WRITE_SORTED_MAP_ENTRIES,
// 重写`DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIMEZONE`
ADJUST_DATES_TO_CONTEXT_TIME_ZONE;
}