/** * Enumeration that defines all togglable features for parsers. */ public enum Feature { // // // Low-level I/O handling features: /** * 这个特性,决定了解析器是否将自动关闭那些不属于parser自己的输入源。 如果禁止,则调用应用不得不分别去关闭那些被用来创建parser的基础输入流InputStream和reader; * 如果允许,parser只要自己需要获取closed方法(当遇到输入流结束,或者parser自己调用 JsonParder#close方法),就会处理流关闭。 * * 注意:这个属性默认是true,即允许自动关闭流 * */ AUTO_CLOSE_SOURCE(true), // // // Support for non-standard data format constructs /** * 该特性决定parser将是否允许解析使用Java/C++ 样式的注释(包括'/'+'*' 和'//' 变量)。 由于JSON标准说明书上面没有提到注释是否是合法的组成,所以这是一个非标准的特性; * 尽管如此,这个特性还是被广泛地使用。 * * 注意:该属性默认是false,因此必须显式允许,即通过JsonParser.Feature.ALLOW_COMMENTS 配置为true。 * */ ALLOW_COMMENTS(false), /** * 这个特性决定parser是否将允许使用非双引号属性名字, (这种形式在Javascript中被允许,但是JSON标准说明书中没有)。 * * 注意:由于JSON标准上需要为属性名称使用双引号,所以这也是一个非标准特性,默认是false的。 * 同样,需要设置JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES为true,打开该特性。 * */ ALLOW_UNQUOTED_FIELD_NAMES(false), /** * 该特性决定parser是否允许单引号来包住属性名称和字符串值。 * * 注意:默认下,该属性也是关闭的。需要设置JsonParser.Feature.ALLOW_SINGLE_QUOTES为true * */ ALLOW_SINGLE_QUOTES(false), /** * 该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。 * JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性。 * * 注意:默认时候,该属性关闭的。需要设置:JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS为true。 * */ ALLOW_UNQUOTED_CONTROL_CHARS(false), /** * 该特性可以允许接受所有引号引起来的字符,使用‘反斜杠’机制:如果不允许,只有JSON标准说明书中 列出来的字符可以被避开约束。 * * 由于JSON标准说明中要求为所有控制字符使用引号,这是一个非标准的特性,所以默认是关闭的。 * * 注意:一般在设置ALLOW_SINGLE_QUOTES属性时,也设置了ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER属性, * 所以,有时候,你会看到不设置ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER为true,但是依然可以正常运行。 * * @since 1.6 */ ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false), /** * 该特性决定parser是否允许JSON整数以多个0开始(比如,如果000001赋值给json某变量, * 如果不设置该属性,则解析成int会抛异常报错:org.codehaus.jackson.JsonParseException: Invalid numeric value: Leading zeroes not * allowed) * * 注意:该属性默认是关闭的,如果需要打开,则设置JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS为true。 * * @since 1.8 */ ALLOW_NUMERIC_LEADING_ZEROS(false), /** * 该特性允许parser可以识别"Not-a-Number" (NaN)标识集合作为一个合法的浮点数。 例如: allows (tokens are quoted contents, not including * quotes): * <ul> * <li>"INF" (for positive infinity), as well as alias of "Infinity" * <li>"-INF" (for negative infinity), alias "-Infinity" * <li>"NaN" (for other not-a-numbers, like result of division by zero) * </ul> */ ALLOW_NON_NUMERIC_NUMBERS(false), // // // Controlling canonicalization (interning etc) /** * 该特性决定JSON对象属性名称是否可以被String#intern 规范化表示。 * * 如果允许,则JSON所有的属性名将会 intern() ;如果不设置,则不会规范化, * * 默认下,该属性是开放的。此外,必须设置CANONICALIZE_FIELD_NAMES为true * * 关于intern方法作用:当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串 (该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String * 对象添加到池中, 并且返回此 String 对象的引用。 * * @since 1.3 */ INTERN_FIELD_NAMES(true), /** * 该特性决定JSON对象的属性名称是否被规范化。 * * @since 1.5 */ CANONICALIZE_FIELD_NAMES(true), ; final boolean _defaultState; /** * Method that calculates bit set (flags) 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) { _defaultState = defaultState; } public boolean enabledByDefault() { return _defaultState; } public boolean enabledIn(int flags) { return (flags & getMask()) != 0; } public int getMask() { return (1 << ordinal()); } }; /** * Enumeration that defines togglable features that guide the serialization feature. */ public enum Feature implements MapperConfig.ConfigFeature { /* * /****************************************************** Introspection features * /****************************************************** */ /** * 该特性决定是否启动内部注解功能支持配置;如果允许,则使用AnnotationIntrospector扫描配置,否则,不考了注解配置。 * * 默认启动该功能配置属性。 * * @since 1.2 */ USE_ANNOTATIONS(true), /** * 该特性决定是否使用“getter”方法来根据标准bean命名转换方式来自动检测。如果true,则所有公共的带有一个参数 * 并且前缀为set的方法都将被当做setter方法。如果false,只会把显式注解的作为setter方法。 * * 注意: 这个特性的优先级低于显式注解,并且只会在获取不到更细粒度配置的情况下。 * */ AUTO_DETECT_GETTERS(true), DETECT_IS_GETTERS(true), /** * 该特性决定是否使用creator方法来根据公共构造函数以及名字为“valueOf”的静态单参数方法自动检测。 * * 注意:这个特性比每个类上注解的优先级要低。 * */ AUTO_DETECT_CREATORS(true), /** * 这个特性决定是否非静态field被当做属性。如果true,则所有公共成员field都被当做属性, 否则只有注解,才会被当做属性field。 * */ AUTO_DETECT_FIELDS(true), /** * 使用getter方法来作为setter方法(一般只处理集合和Maps,和其他没有setter的类型)。 该属性决定是否不需要setter方法,而只需要getter方法来修改属性。 * * 注意:该配置优先级低于setter。 */ USE_GETTERS_AS_SETTERS(true), /** * 该特性决定当访问属性时候,方法和field访问是否修改设置。 如果设置为true,则通过反射调用方法AccessibleObject#setAccessible 来允许访问不能访问的对象。 * */ CAN_OVERRIDE_ACCESS_MODIFIERS(true), GETTERS(false), /* * /****************************************************** /* Type conversion features * /****************************************************** */ /** * 该特性决定对于json浮点数,是否使用BigDecimal来序列化。如果不允许,则使用Double序列化。 * * 注意:该特性默认是关闭的,因为性能上来说,BigDecimal低于Double。 * */ USE_BIG_DECIMAL_FOR_FLOATS(false), /** * 该特性决定对于json整形(非浮点),是否使用BigInteger来序列化。如果不允许,则根据数值大小来确定 是使用Integer}, {@link Long} 或者 * {@link java.math.BigInteger} * */ USE_BIG_INTEGER_FOR_INTS(false), // [JACKSON-652] /** * 该特性决定JSON ARRAY是映射为Object[]还是List<Object>。如果开启,都为Object[],false时,则使用List。 * * @since 1.9 */ USE_JAVA_ARRAY_FOR_JSON_ARRAY(false), /** * 该特性决定了使用枚举值的标准序列化机制:如果允许,则枚举假定使用Enum.toString()返回的值作为序列化结构;如果禁止, 则返回Enum.name()的值。 * * 注意:默认使用的时Enum.name()的值作为枚举序列化结果。这个的设置和WRITE_ENUMS_USING_TO_STRING需要一致。 * * For further details, check out [JACKSON-212] * * @since 1.6 */ READ_ENUMS_USING_TO_STRING(false), /* * /****************************************************** Error handling features * /****************************************************** 错误处理特性 */ DeserializationConfig反序列化相关配置属性 将Java 对象序列化为Json字符串。Jackson在序列化Java对象的时候,对于有些不存在的属性处理,以及一些类型转换等,都可以通过配置来设置。 /** * 该特性决定了当遇到未知属性(没有映射到属性,没有任何setter或者任何可以处理它的handler),是否应该抛出一个 * JsonMappingException异常。这个特性一般式所有其他处理方法对未知属性处理都无效后才被尝试,属性保留未处理状态。 * * 默认情况下,该设置是被打开的。 * * @since 1.2 */ FAIL_ON_UNKNOWN_PROPERTIES(true), /** * 该特性决定当遇到JSON null的对象是java 原始类型,则是否抛出异常。当false时,则使用0 for 'int', 0.0 for double 来设定原始对象初始值。 * * 默认情况下,允许原始类型可以使用null。 * * @since 1.7 */ FAIL_ON_NULL_FOR_PRIMITIVES(false), /** * 该特性决定JSON 整数是否是一个有效的值,当被用来反序列化Java枚举值。如果false,数字可以接受,并且映射为枚举的值ordinal(); * 如果true,则数字不允许并且抛出JsonMappingException异常。后面一种行为原因是因为大部分情况下,枚举被反序列化为 JSON 字符串, 从而造成从整形到枚举的意外映射关系。 * * Feature is disabled by default (to be consistent with behavior of Jackson 1.6), i.e. to allow use of JSON * integers for Java enums. * * @since 1.7 */ FAIL_ON_NUMBERS_FOR_ENUMS(false), /** * 异常封装,不封装Error,catch异常之后,抛出IOException。默认封装异常。 * * @since 1.7 */ WRAP_EXCEPTIONS(true), /* * /****************************************************** Structural conversion features * /****************************************************** 数据结构转换特性 */ /** * 该特性决定是否接受强制非数组(JSON)值到Java集合类型。如果允许,集合反序列化将尝试处理非数组值。 * * Feature that determines whether it is acceptable to coerce non-array (in JSON) values to work with Java * collection (arrays, java.util.Collection) types. If enabled, collection deserializers will try to handle * non-array values as if they had "implicit" surrounding JSON array. This feature is meant to be used for * compatibility/interoperability reasons, to work with packages (such as XML-to-JSON converters) that leave out * JSON array in cases where there is just a single element in array. * * @since 1.8 */ ACCEPT_SINGLE_VALUE_AS_ARRAY(false), /** * 该特征允许 unwrap根级别JSON 值,来匹配WRAP_ROOT_VALUE 序列化设置。 * * @since 1.9 */ UNWRAP_ROOT_VALUE(false), /* * /****************************************************** Value conversion features * /****************************************************** 值转换特性 */ /** * 该特性可以允许JSON空字符串转换为POJO对象为null。如果禁用,则标准POJO只会从JSON null或者JSON对象转换过来; * 如果允许,则空JSON字符串可以等价于JSON null。 * @since 1.8 */ ACCEPT_EMPTY_STRING_AS_NULL_OBJECT(false) ; final boolean _defaultState; private Feature(boolean defaultState) { _defaultState = defaultState; } @Override public boolean enabledByDefault() { return _defaultState; } @Override public int getMask() { return (1 << ordinal()); } }