Json工具(一)- Jackson

1、Jackson简介

Jackson是常用的高效安全的Json序列化和反序列化框架。Spring MVC 默认的 json 解析器是 Jackson。Jackson有三个核心模块。

jackson-core:提供 Jackson 处理 JSON 数据的核心功能,如流式解析和生成 JSON,提供基本的API。

jackson-annotations:提供注解编程相关的核心注解。

jackson-databind:提供数据绑定功能,使得 JSON 和 Java 对象之间的转换变得简单,提供ObjectMapper和许多用于映射数据的功能。

2、ObjectMapper

ObjectMapper是Jackson提供的序列化和反序列化工具,并且提供了各种定制的API以满足不同类型,不同约束的序列化和反序列化要求。ObjectMapper的入门使用案例如下:

public class JacksonTest1 {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        Person person = new Person();
        person.setAge(25);
        person.setDate(new Date());
        person.setName("xuyuan");
        person.setHeight(178);

        /* 序列化 */
        String jsonString = objectMapper.writeValueAsString(person);
        System.out.println(jsonString);
        //{"myHeight":178,"birthday":"2024-08-27 11:00:32","myAge":25,"myName":"xuyuan"}
        /* 反序列化 */
        Person newPerson = objectMapper.readValue(jsonString, Person.class);
        System.out.println(newPerson);
        // Person(name=xuyuan, age=25, date=Tue Aug 27 19:00:32 CST 2024, height=178)
        /* 对象转换 */
        Animal animal = objectMapper.convertValue(person, Animal.class);
        System.out.println(animal);
        // Animal(field1=xuyuan, field2=25, field3=Tue Aug 27 19:00:32 CST 2024, field4=178)
    }
}

@Data
class Person {
    @JsonProperty(value = "myName", index = 4)
    private String name;
    @JsonProperty(value = "myAge", index = 3)
    private Integer age;

    @JsonProperty(value = "birthday", index = 2)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Date date;
    @JsonProperty(value = "myHeight", index = 1)
    private int height;
}

@Data
class Animal {
    @JsonProperty("myName")
    private String field1;
    @JsonProperty("myAge")
    private Integer field2;

    @JsonProperty("birthday")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date field3;
    @JsonProperty("myHeight")
    private int field4;
}

3、ObjectMapper配置

ObjectMapper提供流式API,有相当丰富的配置选项。以下对配置作简单的说明,了解即可。具体使用的时候,需要使用相关配置,请参考官方文档。

(1)统一配置config

        mapper.setConfig();
        // 参数为DeserializationConfig或者SerializationConfig,设置 ObjectMapper的所有全局配置
        // DeserializationConfig: 控制反序列化过程中的配置,如如何处理未知属性、类型处理、字段可见性等。
        // SerializationConfig: 控制序列化过程中的配置,如属性的包含策略、日期格式、命名策略等。

(2)SerializationConfig和DeserializationConfig的配置

        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 设置日期格式
        mapper.setTimeZone(TimeZone.getTimeZone("UTC+8")); // 设置时区。影响日期和时间的格式化和解析。
        mapper.setLocale(Locale.CHINA); // 设置区域设置。影响日期、数字等格式化的本地化设置。
        mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); // 设置JSON和JAVA对象的映射规则

        // mapper.setAccessorNaming(new DefaultAccessorNamingStrategy.Provider()); // 设置属性命名策略。定义如何将 Java 对象的属性名称转换为 JSON 中的字段名称。
        // mapper.setAnnotationIntrospector(); // 设置注解解析器。用于定义如何处理 Jackson 注解,比如 @JsonIgnore 或 @JsonProperty
        // mapper.setBase64Variant(); // 设置 Base64 编码变体。用于指定 JSON 中的 Base64 数据使用的编码方案
        // mapper.setDefaultAttributes(); // 配置默认属性的特性。允许启用或禁用 ObjectMapper 的某些特性(例如是否允许未知属性)
        // mapper.setDefaultTyping(); // 设置默认的类型处理。定义如何处理多态类型(例如使用类型信息进行反序列化)
        // mapper.setHandlerInstantiator(); // 设置处理程序实例化器。用于创建和管理 JSON 处理程序(如序列化器、反序列化器)的实例
        // 设置属性命名策略,与 setAccessorNaming 类似,定义 JSON 字段名称与 Java 属性名称的映射。(LOWER_CASE、LOWER_CAMEL_CASE、KEBAB_CASE)
        // mapper.setMixInResolver(); // 设置 MixIn 解析器。用于配置 MixIn 注解类的解析策略。
        // mapper.setSerializerFactory(); // 设置序列化工厂。用于配置自定义序列化器的创建和管理

(3)DeserializationConfig的私有配置

        // mapper.setConstructorDetector(); // 设置构造函数检测器。配置如何选择和使用构造函数进行反序列化。
        // mapper.setNodeFactory(); // 设置节点工厂。定义如何创建 JSON 节点(如对象、数组、值等)
        // mapper.setPolymorphicTypeValidator(); // 设置多态类型验证器。用于控制多态类型的验证策略,确保 JSON 数据的类型安全。

(4)SerializationConfig的私有配置

        // mapper.setDefaultPrettyPrinter(); // 设置默认的漂亮打印器。定义 JSON 序列化时如何美化输出(例如添加缩进)
        // mapper.setFilterProvider();// 设置过滤器提供者。用于动态控制哪些属性在序列化时被包含或排除

(5)ConfigOverrides的配置

        // mapper.setDefaultPropertyInclusion(); // 设置默认属性包含策略。与 setSerializationInclusion 类似,用于设置全局的属性包含策略
        // mapper.setDefaultSetterInfo(); // 设置默认的 setter 方法可见性。控制哪些 setter 方法对 JSON 反序列化可见
        // mapper.setDefaultVisibility(); // 设置默认的可见性。控制 JSON 序列化和反序列化时哪些字段和方法是可见的。
        // mapper.setDefaultLeniency(); // 设置默认宽松性。定义 ObjectMapper 在反序列化时是否宽松对待 JSON 内容(如忽略某些错误)
        // mapper.setDefaultMergeable(); // 设置默认可合并性。用于配置合并 JSON 对象的策略。
        // mapper.setSerializationInclusion(); // 设置序列化包含策略。控制哪些属性在序列化时包含到 JSON 中,例如可以配置仅包含非空属性。
        // mapper.setVisibility(); // 设置属性访问器的可见性。控制特定类型(如字段、方法)的可见性。

(6)InjectableValues的配置

        InjectableValues.Std injectableValues = new InjectableValues.Std();
        injectableValues.addValue("responseTime", new Date());
        mapper.setInjectableValues(injectableValues); // 设置默认的可注入值。允许在反序列化时注入额外的值到Java对象中。

(7)SimpleMixInResolver的配置

        // mapper.setMixIns(); // 设置 MixIn 注解类。允许将自定义注解应用到特定的类上,修改其序列化和反序列化行为。

(8)DefaultSerializerProvider的配置

        // mapper.setSerializerProvider(); // 设置序列化提供者。用于提供自定义的序列化策略和上下文。

(9)SubtypeResolver的配置

       // mapper.setSubtypeResolver(); // 设置子类型解析器。用于管理多态类型的子类解析。

(10)开启关闭某个序列化和反序列化的配置

参考SerializationFeature、DeserializationFeature、JsonParser.Feature、JsonGenerator.Feature给出的配置项。

        // mapper.enable();
        // mapper.disable();
        // mapper.configure();
        // 配置序列化某一个特定特性与enable和disable方法类似
        // 配置项为SerializationFeature、DeserializationFeature、JsonParser.Feature、JsonGenerator.Feature

(11)SerializationFeature

public enum SerializationFeature implements ConfigFeature {
    /**
     * 根值是否序列化
     */
    WRAP_ROOT_VALUE(false),

    /**
     * 美化输出,缩进格式输出JSON
     */
    INDENT_OUTPUT(false),


    /**
     * 序列化空Bean时, 是否抛出异常,默认抛出异常。
     * 空Bean即没有任何属性的Bean,或者有属性但是没有对应的get方法。
     */
    FAIL_ON_EMPTY_BEANS(true),

    /**
     * 自身循环引用时,是否抛出异常,默认抛出异常。
     *
     * @since 2.4
     */
    FAIL_ON_SELF_REFERENCES(true),

    /**
     * 包装异常,在序列化对象时如果出现异常,会捕获异常,进行包装后再抛出,以提供更详细的错误信息
     */
    WRAP_EXCEPTIONS(true),

    /**
     * 序列化时,如果已要求JSON中包含对象的类型信息,但是又有@JsonUnwrapped注解,则序列化失败。@JsonUnwrapped会去除对象结构,直接平铺对象内的属性
     *
     * @since 2.4
     */
    FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS(true),

    /**
     * 自身循环引用,序列化为null
     *
     * @since 2.11
     */
    WRITE_SELF_REFERENCES_AS_NULL(false),


    /**
     * 对象实现了Closeable接口,序列化后自动调用close()方法。默认禁用(不调用close()方法)。
     */
    CLOSE_CLOSEABLE(false),

    /**
     * writeValue序列化之后,是否调用JsonGenerator的flush
     */
    FLUSH_AFTER_WRITE_VALUE(true),


    /* TODO 特定数据类型的配置 */
    /*TODO 日期类型*/
    /**
     * 日期类型序列化成时间戳。如果禁用默认使用StdDateFormat(yyyy-MM-dd'T'HH:mm:ss.SSSX)格式化日期
     */
    WRITE_DATES_AS_TIMESTAMPS(true),

    /**
     * Map日期类型的key序列化为时间戳。默认禁用,使用StdDateFormat(yyyy-MM-dd'T'HH:mm:ss.SSSX)格式化日期
     */
    WRITE_DATE_KEYS_AS_TIMESTAMPS(false),

    /**
     * 序列化日期上的时区ID。默认禁用。启用时,日期的后面会带上时区ID,这种日期反序列化可能会有问题。
     *
     * @since 2.6
     */
    WRITE_DATES_WITH_ZONE_ID(false),

    /**
     * 使用ObjectMapper上下文中的时区序列化日期,对没有时区信息的日期类型无效。默认启用。禁用则使用默认的时区进行序列化日期。
     *
     * @since 2.13
     */
    WRITE_DATES_WITH_CONTEXT_TIME_ZONE(true),

    /**
     * Duration类型的对象序列化为时间戳。
     *
     * @since 2.5
     */
    WRITE_DURATIONS_AS_TIMESTAMPS(true),

    /*TODO CHAR数组*/
    /**
     * char数组序列化为json数组,禁用时会序列化为字符串
     */
    WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS(false),

    /*TODO 枚举*/
    /**
     * 举值的序列化方式。启用时,使用Enum.toString()的返回值;禁用时,使用Enum.name()的返回值。
     */
    WRITE_ENUMS_USING_TO_STRING(false),

    /**
     * 枚举值的序列化方式。启用时,枚举序列化为数字(序号,从0开始),使用Enum.ordinal()的返回值。禁用时,枚举序列化为文本。默认禁用。
     */
    WRITE_ENUMS_USING_INDEX(false),

    /**
     * 枚举值的序列化方式。枚举作为Map的key时,序列化为数字(序号)。默认禁用。
     *
     * @since 2.10
     */
    WRITE_ENUM_KEYS_USING_INDEX(false),

    /*TODO 集合*/
    /**
     * Map中null值的序列化方式。启用时,序列化null值;禁用时,不序列化null值。建议使用JsonInclude.Include.NON_NULL过滤null
     */
    @Deprecated // since 2.9
            WRITE_NULL_MAP_VALUES(true),

    /**
     * 空集合、空数组的序列化方式。启用时,序列化为空数组;禁用时,不序列化。默认启用。对Map无效。建议使用JsonInclude.Include.NON_EMPTY过滤空集合、空数组。
     */
    @Deprecated // since 2.8
            WRITE_EMPTY_JSON_ARRAYS(true),

    /**
     * 只有单个元素的集合、数组的序列化方式。启用时,正常序列化为数组;禁用时,不序列化为数组(去掉了层级)。默认禁用。
     */
    WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED(false),

    /*TODO BIGDECIMAL*/
    /**
     * 启用时,使用BigDecimal.toPlainString()的返回值;禁用时,使用BigDecimal.toString()的返回值,可能出现科学计数法。
     * 从2.5版本开始废弃,建议使用JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN。
     * BigDecimal有三个toString()方法:
     * toEngineeringString:有必要时使用工程计数法。工程记数法与科学技术法类似,但要求10的幂必须是3的倍数;
     * toPlainString:不使用任何指数;
     * toString:有必要时使用科学计数法。
     */
    @Deprecated // since 2.5
            WRITE_BIGDECIMAL_AS_PLAIN(false),

    /**
     * 是否使用纳秒时间戳写入数字时间戳值
     * @since 2.2
     */
    WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS(true),

    /**
     * 序列化Map时按Key进行排序。启用:排序;禁用:不排序。默认禁用。
     */
    ORDER_MAP_ENTRIES_BY_KEYS(false),

    /**
     * Jackson 会在序列化期间主动获取并缓存所有的序列化器,这可以提高序列化的性能,因为序列化器不需要在序列化过程中动态创建。
     * @since 2.1
     */
    EAGER_SERIALIZER_FETCH(true),

    /**
     * Jackson 序列化对象时会调用 equals() 方法来确定对象引用的唯一性,而不是依赖 Object.hashCode()。
     * 注意,这个特性可能会影响序列化的性能,因为它可能会导致比使用 hashCode() 更慢的 equals() 方法调用。只有当你确实需要依据对象的内容而不是引用来序列化对象时,才应该考虑启用这个特性。
     * @since 2.3
     */
    USE_EQUALITY_FOR_OBJECT_ID(false);

    private final boolean _defaultState;
    private final int _mask;

    private SerializationFeature(boolean defaultState) {
        _defaultState = defaultState;
        _mask = (1 << ordinal());
    }

    @Override
    public boolean enabledByDefault() {
        return _defaultState;
    }


    @Override
    public int getMask() {
        return _mask;
    }

    @Override
    public boolean enabledIn(int flags) {
        return (flags & _mask) != 0;
    }
}

(12)DeserializationFeature

public enum DeserializationFeature implements ConfigFeature {

    /**
     * 反序列化使用BIG_DECIMAL接收float
     */
    USE_BIG_DECIMAL_FOR_FLOATS(false),

    /**
     * 反序列化使用BIG_INTEGER接收int
     */
    USE_BIG_INTEGER_FOR_INTS(false),

    /**
     * 反序列化使用Long接收int
     */
    USE_LONG_FOR_INTS(false),

    /**
     * 在反序列化时,将 JSON 数组反序列化为 Java 数组。
     */
    USE_JAVA_ARRAY_FOR_JSON_ARRAY(false),

    /**
     * 在遇到未知属性时抛出异常。用于强制要求所有属性都应在对象定义中有对应的字段或 setter 方法。
     */
    FAIL_ON_UNKNOWN_PROPERTIES(true),

    /**
     * 在原始类型的属性为 null 时抛出异常。用于确保原始类型不为 null。
     */
    FAIL_ON_NULL_FOR_PRIMITIVES(false),

    /**
     * 在枚举类型的属性为数值类型(如整数)时抛出异常。用于确保枚举类型的属性只能是字符串类型。
     */
    FAIL_ON_NUMBERS_FOR_ENUMS(false),

    /**
     * 在找不到合适的子类型时抛出异常。用于确保在反序列化时能够正确匹配子类型。
     */
    FAIL_ON_INVALID_SUBTYPE(true),

    /**
     * 在读取重复的树节点键时抛出异常。用于确保树形结构中每个键都是唯一的。
     */
    FAIL_ON_READING_DUP_TREE_KEY(false),

    /**
     * 在忽略属性时抛出异常。用于检测是否有未处理的属性。
     */
    FAIL_ON_IGNORED_PROPERTIES(false),

    /**
     * 如果JSON字符串中包含某个对象没有对应的字段或属性,并且没有任何setter或handler来处理这种情况,那么默认行为是抛出异常。
     */
    FAIL_ON_UNRESOLVED_OBJECT_IDS(true),

    /**
     * 在缺少构造器参数时抛出异常。用于确保所有构造器参数都能被正确初始化。
     */
    FAIL_ON_MISSING_CREATOR_PROPERTIES(false),

    /**
     * 在构造器参数为 null 时抛出异常。用于确保构造器参数不为 null。
     */
    FAIL_ON_NULL_CREATOR_PROPERTIES(false),

    /**
     * 当你在使用 Jackson 进行 JSON 反序列化时,如果你的 JSON 数据中包含了用于指示具体类型的字段(例如,使用了 @class 属性来表示具体的类型),
     * Jackson 需要知道如何处理这个字段。如果没有配置相应的处理策略,当这个字段缺失时,Jackson 可能无法正确地确定对象的类型,进而可能导致反序列化失败。
     */
    FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY(true),

    /**
     * 如果存在额外的标记,即使这些标记并不影响JSON对象的主要结构,Jackson也会抛出异常,因为这违反了JSON格式的正确性。
     * 这种行为有助于确保数据的完整性和正确性,避免因为末尾的额外标记导致的潜在错误。
     */
    FAIL_ON_TRAILING_TOKENS(false),

    /**
     * 将解析过程中发生的异常封装为 Jackson 运行时异常,而不是普通的 IOException
     */
    WRAP_EXCEPTIONS(true),

    /**
     * 允许将单一值反序列化为数组。当遇到单一值时,将其解析为只包含该值的数组。
     */
    ACCEPT_SINGLE_VALUE_AS_ARRAY(false),

    /**
     * 允许在反序列化数组时解包单个元素。当数组仅包含一个元素时,返回该元素而不是数组。
     */
    UNWRAP_SINGLE_VALUE_ARRAYS(false),

    /**
     * 允许解包根对象,将根对象的属性直接提取为反序列化的结果。
     */
    UNWRAP_ROOT_VALUE(false),

    /**
     * 允许将空字符串反序列化为 null 对象。当遇到空字符串时,解析为 null。
     */
    ACCEPT_EMPTY_STRING_AS_NULL_OBJECT(false),

    /**
     * 允许将空数组([])反序列化为 null 对象。当遇到空数组时,解析为 null。
     */
    ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT(false),

    /**
     * 允许将浮点数作为整数进行反序列化。当遇到浮点数时,如果它表示一个整数,则解析为整数
     */
    ACCEPT_FLOAT_AS_INT(true),

    /**
     * 使用toString()方法获取枚举值的字符串形式
     */
    READ_ENUMS_USING_TO_STRING(false),

    /**
     * 将未知的枚举值反序列化为 null
     */
    READ_UNKNOWN_ENUM_VALUES_AS_NULL(false),

    /**
     * 当反序列化枚举时,如果遇到未知的枚举值,将使用枚举的默认值。
     */
    READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE(false),

    /**
     * 将时间戳解析为纳秒
     */
    READ_DATE_TIMESTAMPS_AS_NANOSECONDS(true),

    /**
     * 在反序列化过程中调整日期时间值到上下文时区
     */
    ADJUST_DATES_TO_CONTEXT_TIME_ZONE(true),

    /**
     * 决定是否立即获取序列化器,使用缓存
     * EAGER_SERIALIZER_FETCH的设置取决于应用的具体需求和性能与内存使用的权衡。
     * 如果应用对性能有较高要求,且能够接受一定的内存增加,那么设置为true可能是合适的。
     * 反之,如果更注重内存使用的效率,或者对性能要求不是特别高,那么可以考虑保持默认设置或根据具体情况进行调整‌
     */
    EAGER_DESERIALIZER_FETCH(true);

    private final boolean _defaultState;
    private final int _mask;

    private DeserializationFeature(boolean defaultState) {
        _defaultState = defaultState;
        _mask = (1 << ordinal());
    }

    @Override
    public boolean enabledByDefault() {
        return _defaultState;
    }

    @Override
    public int getMask() {
        return _mask;
    }

    @Override
    public boolean enabledIn(int flags) {
        return (flags & _mask) != 0;
    }
}

(13)JsonParser.Feature

public enum Feature {
        // // // Low-level I/O handling features:

        /**
         * JsonParser 实例在解析完成后是否自动关闭输入源的特性。
         * 如果启用此特性,解析器会在解析完成后自动关闭与之关联的 InputStream、Reader 或其他输入源。
         */
        AUTO_CLOSE_SOURCE(true),

        /**
         * JsonParser是否允许解析Java/C++风格注释的特性。由于JSON规范不支持注释,这个特性是非标准的,且默认是禁用的。
         * 从Jackson 2.10开始,推荐使用JsonReadFeature#ALLOW_JAVA_COMMENTS来配置这个特性。
         */
        ALLOW_COMMENTS(false),

        /**
         * 配置JsonParser是否允许解析YAML风格的注释。 由于JSON规范不支持注释,这个特性是非标准的,且默认是禁用的。
         * 推荐使用JsonReadFeature#ALLOW_YAML_COMMENTS来配置这个特性。
         */
        ALLOW_YAML_COMMENTS(false),


        ALLOW_UNQUOTED_FIELD_NAMES(false),


        ALLOW_SINGLE_QUOTES(false),


        @Deprecated
        ALLOW_UNQUOTED_CONTROL_CHARS(false),

        @Deprecated
        ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false),


        @Deprecated
        ALLOW_NUMERIC_LEADING_ZEROS(false),


        @Deprecated
        ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS(false),


        @Deprecated
        ALLOW_NON_NUMERIC_NUMBERS(false),


        @Deprecated
        ALLOW_MISSING_VALUES(false),


        @Deprecated
        ALLOW_TRAILING_COMMA(false),

        // // // Validity checks

        /**
         * 配置JsonParser是否应该检查JSON对象中的重复字段名。
         * 启用该特性会增加性能开销,增加基础解析的执行时间约20-30%,JsonParser会检查当前上下文中的所有字段名,并在遇到重复字段名时抛出一个JsonParseException异常。
         */
        STRICT_DUPLICATE_DETECTION(false),

        /**
         * 未知属性的处理方式。尝试读取一个未知的属性时,将会抛出一个JsonProcessingException异常。
         */
        IGNORE_UNDEFINED(false),

        // // // Other

        /**
         * 是否应该包含对源数据的引用。可用于控制在解析异常等情况下是否泄露有关源数据的详细信息。
         */
        INCLUDE_SOURCE_IN_LOCATION(true),

        ;

        /**
         * Whether feature is enabled or disabled by default.
         */
        private final boolean _defaultState;

        private final int _mask;

        /**
         * Method that calculates bit set (flags) of all features that
         * are enabled by default.
         *
         * @return Bit mask of all features that are enabled by default
         */
        public static int collectDefaults() {
            int flags = 0;
            for (Feature f : values()) {
                if (f.enabledByDefault()) {
                    flags |= f.getMask();
                }
            }
            return flags;
        }

        private Feature(boolean defaultState) {
            _mask = (1 << ordinal());
            _defaultState = defaultState;
        }

        public boolean enabledByDefault() {
            return _defaultState;
        }

        public boolean enabledIn(int flags) {
            return (flags & _mask) != 0;
        }

        public int getMask() {
            return _mask;
        }
    }

(14)JsonGenerator.Feature

    public enum Feature {
        // // Low-level I/O / content features

        
        AUTO_CLOSE_TARGET(true),

       
        AUTO_CLOSE_JSON_CONTENT(true),

        
        FLUSH_PASSED_TO_STREAM(true),

        // // Quoting-related features
        
        
        @Deprecated
        QUOTE_FIELD_NAMES(true),

       
         @Deprecated
        QUOTE_NON_NUMERIC_NUMBERS(true),

        // // Character escaping features

        
        @Deprecated
        ESCAPE_NON_ASCII(false),

        // // Datatype coercion features

       
        @Deprecated
        WRITE_NUMBERS_AS_STRINGS(false),

        
        WRITE_BIGDECIMAL_AS_PLAIN(false),

        // // Schema/Validity support features

        STRICT_DUPLICATE_DETECTION(false),
        
        
        IGNORE_UNKNOWN(false),
        ;

        private final boolean _defaultState;
        private final int _mask;
        
       
        public static int collectDefaults()
        {
            int flags = 0;
            for (Feature f : values()) {
                if (f.enabledByDefault()) {
                    flags |= f.getMask();
                }
            }
            return flags;
        }
        
        private Feature(boolean defaultState) {
            _defaultState = defaultState;
            _mask = (1 << ordinal());
        }

        public boolean enabledByDefault() { return _defaultState; }

        // @since 2.3
        public boolean enabledIn(int flags) { return (flags & _mask) != 0; }

        public int getMask() { return _mask; }
    }

4、ObjectMapper成员变量

/**
     * 创建JsonParser和JsonGenerator的工厂对象
     */
    protected final JsonFactory _jsonFactory;

    /**
     * 用于创建JavaType实例的工厂
     * 需要允许模块添加更多自定义类型处理(主要是为了支持非 Java JVM 语言的类型)
     */
    protected TypeFactory _typeFactory;

    /**
     * 获取反序列化自定义注入值的处理器
     */
    protected InjectableValues _injectableValues;

    /**
     * 处理多态类型的序列化和反序列化
     */
    protected SubtypeResolver _subtypeResolver;

    /**
     * 提供覆盖ObjectMapper的配置,定制化为每一个类提供重写的配置,还有全局的配置覆盖ObjectMapper的配置
     * @since 2.9
     */
    protected final ConfigOverrides _configOverrides;

    /**
     * 配置相关的强制类型转换规则
     * @since 2.12
     */
    protected final CoercionConfigs _coercionConfigs;

    /**
     * 负责处理和Mix-in注解相关的逻辑。Mix-in注解是一种在运行时向Jackson对象映射系统添加注解的方法,这些注解可以是全局配置或者是针对特定类或字段的配置。
     * @since 2.6
     */
    protected SimpleMixInResolver _mixIns;

    /**
     * 定义序列化过程中基本的全局配置
     */
    protected SerializationConfig _serializationConfig;

    /**
     * 根据要序列化的对象的类型提供合适的序列化器(JsonSerializer<T>)
     */
    protected DefaultSerializerProvider _serializerProvider;

    /**
     * 负责创建序列化器(JsonSerializer<T>)
     */
    protected SerializerFactory _serializerFactory;

    /**
     * 定义反序列化过程中基本的全局配置
     */
    protected DeserializationConfig _deserializationConfig;

    /**
     * 提供了在反序列化过程中需要的各种服务和信息。包括相关所有配置
     */
    protected DefaultDeserializationContext _deserializationContext;

    /**
     处理JSON序列化和反序列化的核心类,它支持通过模块(Module)系统来扩展其功能。
     每个模块都可以注册自定义的序列化器(JsonSerializer<T>)、反序列化器(JsonDeserializer<T>)等,以便在序列化和反序列化过程中使用。
     * @since 2.5
     */
    protected Set<Object> _registeredModuleTypes;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖子许愿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值