掘金 后端 ( ) • 2024-05-05 17:13

有道无术,术尚可求,有术无道,止于术。

本系列 Jackson 版本 2.17.0

源码地址:https://gitee.com/pearl-organization/study-jaskson-demo

1. 前言

除了使用注解的方式,Jackson还提供了很多Feature特征枚举类,用于定制序列化\反序列化行为,接下来的几篇会详细介绍这些特征。

2. 简介

2.1 JacksonFeature

JacksonFeaturejackson-core模块提供的特性顶级接口,源码说明如下:

public interface JacksonFeature {
	// 检查此功能是否默认启用
    boolean enabledByDefault();
	// 获取特征掩码
    int getMask();
	// 根据掩码查询该特性是否启用
    boolean enabledIn(int flags);
}

JacksonFeature的子类和实现类如下:

image.png

2.1.1 FormatFeature

FormatFeature 接口从名字上很好理解,用于声明数据格式特征:

public interface FormatFeature extends JacksonFeature {
    boolean enabledByDefault();

    int getMask();

    boolean enabledIn(int var1);
}

FormatFeature有两个实现类:

  • JsonWriteFeatureJsonToken写入特性枚举类,用于替代JsonGenerator.Feature
  • JsonReadFeatureJsonToken读取特性枚举类,用于替代JsonParser.Feature

2.1.2 DatatypeFeature

DatatypeFeature 接口从名字上很好理解,用于声明特定的数据类型特征:

public interface DatatypeFeature extends JacksonFeature {
	// 用于高效存储和索引的内部索引
    int featureIndex();
}

DatatypeFeature 有两个实现类:

  • EnumFeature: 处理与java.lang.Enum相关的特性枚举类
  • JsonNodeFeature:处理与com.fasterxml.jackson.databind.JsonNodeJSON数据的读取和构造)相关的特性枚举类

2.1.3 直接实现类

除了FormatFeatureDatatypeFeature 两个接口外,还提供了很多直接实现的类:

  • StreamReadCapability、StreamWriteCapabilityJsonParser、JsonGenerator在给定的格式读写时,提供一组特性配置
  • JavaTimeFeaturejackson-datatype-jsr310模块提供的用于Java时间的特性枚举(不属于三大核心模块,这里不讲解)
  • StreamReadFeature、StreamWriteFeatureJsonParser、JsonGenerator在无关数据格式读写时,提供一组特性配置,用于替代JsonParser.FeatureJsonGenerator.Feature
  • JsonFactory.FeatureJsonFactory特性枚举,同时作用于JsonParser、JsonGenerator

2.3 ConfigFeature

ConfigFeaturejackson-databind提供的接口,专用于数据绑定时提供一组特征。

public interface ConfigFeature {
    boolean enabledByDefault();

    int getMask();

    boolean enabledIn(int var1);
}

ConfigFeature的实现类如下:

image.png

实现类简要说明:

  • MapperFeature:映射绑定相关特性
  • SerializationFeatureDeserializationFeature序列化\反序列化相关特征

2.4 JsonGenerator.Feature、JsonParser.Feature

JsonGenerator.FeatureJsonParser.FeatureJsonParser、JsonGenerator的内部类,它们没有实现任何接口,用于配置读写时的特性配置。

例如JsonGenerator.Feature中,可以看到很多特性都标记了过时,推荐使用其替代品 JsonWriteFeatureJsonReadFeature,统一规范,更加灵活和强大。

    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;
    }