Jackson 中的 JSON 中的 Configure() 方法

2021-08-27 10:29:26 浏览数 (4987)

Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。下面文章将和大家讲讲 Jackson中的json中的Configure()方法的详细内容。

1. #configure(JsonParser.Feature, boolean):

功能名称描述默认值
AUTO_CLOSE_SOURCE会自动关闭传入的 InputStream 或 Readertrue
ALLOW_COMMENTS允许在 JSON 中使用 Java/C++ 风格的注释。 false
ALLOW_YAML_COMMENTS允许在 JSON 中使用 YAML 样式的注释。 false
ALLOW_UNQUOTED_FIELD_NAMES 允许写不带引号的字段false
ALLOW_SINGLE_QUOTES允许使用撇号、字符 '\'' 而不是标准引号false
STRICT_DUPLICATE_DETECTION如果找到重复的字段,则抛出异常false
IGNORE_UNDEFINED在未找到输入内容包含的属性的定义的情况下使用。在JSON解析的情况下没有作用 false
INCLUDE_SOURCE_IN_LOCATION在 JsonLocation 中包含源参考信息。如果该功能被禁用,则会打印 UNKNOWN location true
public class StrictDuplicateMapper {
    public static void main(String[] args) throws JsonProcessingException {
        String json = "{" +
                  "\"name\":\"Ali Z\", " +
                  "\"name\":\"Ali Zh\"" + // will throw exception because that field is duplicated
                "}";

        ObjectMapper mapper = new ObjectMapper()
                .configure(JsonParser.Feature.STRICT_DUPLICATE_DETECTION, true)
                .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);// another way of enabling featur
        mapper.readValue(json, Person.class);
    }

    public static class Person {
        private String name;

        @JsonCreator
        public Person(@JsonProperty("name") String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

2. ObjectMapper#configure(JsonGenerator.Feature, boolean):

功能名称描述默认值
AUTO_CLOSE_TARGET会自动关闭传入的 InputStream 或 Reader true
AUTO_CLOSE_JSON_CONTENT 如果生成器关闭,确定如何处理 JsonToken.START_ARRAY 或 JsonToken.START_OBJECT。如果启用,这些元素会自动关闭;如果禁用,则不执行任何特定操作 true
FLUSH_PASSED_TO_STREAM如果启用调用 JsonGenerator#flush 将具有与 OutputStream 或 Writer 中的 flush() 相同的效果  true
WRITE_BIGDECIMAL_AS_PLAIN将使用 BigDecimal.toPlainString() 将 BigDecimal 写为纯文本  false
STRICT_DUPLICATE_DETECTION 如果找到重复的字段,则抛出异常 false
IGNORE_UNKNOWN如果没有关于必填字段的信息,将抛出 JsonProcessingException。序列化 JSON 时无效。 false
public class JsonGeneratorExample {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper()
                .configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);

        Person person = new Person();
        person.setAge(BigDecimal.valueOf(12334535345456700.12345634534534578901));

        String json = mapper.writeValueAsString(person);

        System.out.println(json);
    }

    public static class Person {
        private BigDecimal age;

        public BigDecimal getAge() {
            return age;
        }

        public void setAge(BigDecimal age) {
            this.age = age;
        }
    }
}

3. ObjectMapper#configure(SerializationFeature, boolean):

功能名称描述默认值
WRAP_ROOT_VALUE

如果启用将包装根值。该功能主要用于 JAXB 兼容性。

如果禁用 JSON 将如下所示:

{"name":"Ali Z"}

如果启用 JSON 将如下所示:

{"Person":{"name":"Ali Z"}}
false
INDENT_OUTPUT

将缩进输出 JSON 字符串。

如果禁用 JSON 将如下所示:

{"name":"Ali Z"}

如果启用 JSON 将如下所示:

{"name":"Ali Z"}
false
FAIL_ON_EMPTY_BEANS如果没有像 getter 这样的字段的访问器,则会抛出异常。  true
FAIL_ON_SELF_REFERENCES如果在 POJO 对象中检测到直接自引用,将抛出特定于 Jackson 的异常。注意如果它被禁用它可能会抛出 StackOverflowError true
WRAP_EXCEPTIONS如果启用,Jackson 将捕获序列化期间抛出的异常,并通过提供附加信息将其与 Jackson 异常包装起来。如果禁用将抛出原始异常。 false
FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS将抛出异常,如果对象具有类型信息但它被标记为 @JsonUnwrapped。如果禁用类型信息将被忽略 true
WRITE_SELF_REFERENCES_AS_NULL将自我导向的引用写为 null。注意 SerializationFeature.FAIL_ON_SELF_REFERENCES 配置被禁用。false
CLOSE_CLOSEABLE如果启用,将 close() 流传递给 writeValue。如果要禁用该功能还要注意 JsonGenerator.Feature.AUTO_CLOSE_TARGET 配置 false
WRITE_DATES_AS_TIMESTAMPS如果启用,Jackson 将序列化用作 Map 键的 java.util.Date(也是子类型)将被序列化为时间戳。如果禁用,将使用 ISO-8601 进行序列化(例如:2021-06-20T10:22:34.364+00:00)false
WRITE_DATES_WITH_ZONE_ID

如果启用,则包括时区信息。例如:

2011-12-03T10:15:30+01:00[欧洲/巴黎]
false
WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS

如果启用会将 char[] 作为 JSON 数组,

{"surname":["Z","h","a","g","p","a","r","o","v"]}

如果禁用将其写为子字符串

{"surname":"Zhagparov"}
false
WRITE_ENUMS_USING_TO_STRING

这两个配置配置了枚举序列化为 JSON 的方式。

如果启用 WRITE_ENUMS_USING_TO_STRING 并且禁用 WRITE_ENUMS_USING_INDEX,它将使用 toString() 序列化枚举

{"permissionEnum":"管理员"}
false
WRITE_ENUMS_USING_INDEX

如果禁用 WRITE_ENUMS_USING_TO_STRING 并启用 WRITE_ENUMS_USING_INDEX,它将使用 Enum.ordinal() 序列化枚举

{"permissionEnum":0}
false
WRITE_ENUM_KEYS_USING_INDEX

如果启用,它将使用 Enum.ordinal() 将 Map 中使用的枚举序列化为键

{"permissionEnum":{"0":"admin"}}

如果禁用,它将使用 Enum.toString() 序列化枚举

{"permissionEnum":{"ADMIN":"admin"}}
false
WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED

如果启用,则不会将包含一个元素的 List 转换为 JSON 数组

{"stringList":"Ali Z"}

如果禁用,它会将具有一个元素的 List 转换为 JSON 数组

{"stringList":["Ali Z"]}
false
WRITE_DATE_TIMESTAMPS_AS_NANOOSECONDS

如果启用,将以纳秒为单位写入日期时间戳。

{“date”:[2021,6,20,14,16,48,260]}

如果禁用,

{“date”:[2021,6,20,14,17,12,990000000]}
true
ORDER_MAP_ENTRIES_BY_KEYS 如果启用,将在序列化之前按键对 Map 条目进行排序。如果禁用,则不会执行排序。 false
EAGER_SERIALIZER_FETCH如果启用,ObjectWriter 将尝试急切地获取必要的 JsonSerializer-s。  true
USE_EQUALITY_FOR_OBJECT_ID

如果启用,将使用 Object.equal() 方法作为对象标识。

如果禁用,将使用真正的 JVM 级别标识作为对象标识。 

false
public class JsonSerializationFeatureExample {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper()
                .configure(SerializationFeature.WRAP_ROOT_VALUE, true)
                .configure(SerializationFeature.INDENT_OUTPUT, true);

        Person person = new Person();
        person.setName("Ali Z");

        String json = mapper.writeValueAsString(person);

        System.out.println(json);
    }

    public static class Person {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

4. ObjectMapper#configure(DeserializationFeature, boolean):

功能名称描述默认值
USE_BIG_DECIMAL_FOR_FLOATS如果启用且字段类型为 Object 或 Number,它将反序列化浮点数为 BigDecimal;如果禁用,它将被反序列化为 Double。 false
USE_BIG_INTEGER_FOR_INTS如果启用且字段类型为 Object 或 Number,它将反序列化非浮点数为 BigInteger。如果禁用,将使用最紧凑的变体。 false
USE_LONG_FOR_INTS如果启用并且字段类型为 Object 或 Number,它将反序列化非浮点数为 Long;如果禁用,将使用最紧凑的变体。 false
USE_JAVA_ARRAY_FOR_JSON_ARRAY如果启用并且字段类型未知,例如 Object,Jackson 会将 JSON 数组反序列化为 Object[];如果禁用,将反序列化为 List<Object> false
FAIL_ON_UNKNOWN_PROPERTIES如果启用,如果发现未知属性,Jackson 将抛出异常。如果禁用将忽略这样的字段。 true
FAIL_ON_NULL_FOR_PRIMITIVES如果启用,如果 JSON 包含原始类型的空值,Jackson 将抛出异常。如果禁用默认值(如 0.0、0 等)将被使用。 false
FAIL_ON_NUMBERS_FOR_ENUMS如果启用,如果 JSON 包含枚举的数字值,Jackson 将抛出异常。如果禁用该值将与 Enum.ordinal() 匹配 false
FAIL_ON_READING_DUP_TREE_KEY如果启用,如果找到重复的树键将失败。如果禁用,则不会引发异常,并且后面的值会覆盖前面的值。 false
FAIL_ON_IGNORED_PROPERTIES如果启用并且 JSON 包含显式标记为可忽略的值,则将引发异常。如果禁用,这些字段将被忽略。 false
FAIL_ON_MISSING_CREATOR_PROPERTIES如果启用,如果 JSON 数据字段未在 POJO 中描述,Jackson 将抛出异常。如果禁用,将为未知字段设置 null。false
FAIL_ON_NULL_CREATOR_PROPERTIES如果启用,如果一个或多个字段作为null 传递给构造函数或静态工厂方法,将引发异常。如果禁用,将忽略此类情况。false
WRAP_EXCEPTIONS如果启用,Jackson 将捕获反序列化期间抛出的异常,并通过提供附加信息将其与 Jackson 异常包装在一起。如果禁用将抛出原始异常。 true
ACCEPT_SINGLE_VALUE_AS_ARRAY如果启用 Jackson 将接受单个值作为数组。如果禁用,则将抛出异常。 false
UNWRAP_SINGLE_VALUE_ARRAYS如果启用,它将解包单个值数组并将其反序列化为相应的数据类型。如果禁用,将抛出异常。 false
UNWRAP_ROOT_VALUE

如果启用,它将解包根值。这意味着它将接受这样的 JSON

{"Person":{"name":"Ali Z"}}

作为

{"name":"Ali Z"}
false
ACCEPT_EMPTY_STRING_AS_NULL_OBJECT

如果启用,对于空字符串,如果与 POJO 字段数据类型不匹配,Jackson 将不会失败

public static class Person{
    private int age;
}

和 JSON 看起来像那样 

{“age”:””}

Jackson 将设置 null 而不是抛出异常。

false
ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT

如果启用,Jackson 不会在与 POJO 字段数据类型不匹配的情况下失败,对于空字符串

public static class Person{    private int age;
}

和 JSON 看起来像那样

{“age”:[]}

Jackson 将设置 null 而不是抛出异常。

false
ACCEPT_FLOAT_AS_INT如果启用,将通过截断数字将浮点数转换为非浮点数(如 Long、long、int 等)。 true
READ_ENUMS_USING_TO_STRING如果启用,它将使用字符串反序列化 Enum。如果禁用,将使用 Enum.ordinal(); false
READ_UNKNOWN_ENUM_VALUES_AS_NULL如果启用,它会将未知的枚举值反序列化为 null。如果禁用将抛出异常。 false
READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE如果启用,它将设置为使用 @JsonEnumDefaultValue 值预定义的未知枚举值。如果禁用,它将抛出异常。 false
READ_DATE_TIMESTAMPS_AS_NANOOSECONDS如果启用,杰克逊将期望以纳秒为单位写入时间戳。如果禁用,时间戳预计以毫秒为单位。 true
ADJUST_DATES_TO_CONTEXT_TIME_ZONE如果启用,它将调整日期属性时区。如果禁用,则只会在值本身不包含时区时进行调整。true
public class DeserializeExample {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper()
                .configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true)
                .enable(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES);

        Person person = mapper.readValue("{}", Person.class);
    }


    public static class Person {
        private Integer age;

        @JsonCreator
        public Person(@JsonProperty("age") Integer age) {
            this.age = age;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "age=" + age +
                    '}';
        }
    }
}