Jackson中的JSON Configure()方法怎么用

2023-04-25,,

本篇内容主要讲解“Jackson中的JSON Configure()方法怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Jackson中的JSON Configure()方法怎么用”吧!

Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。

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

功能名称 描述 默认值
AUTO_CLOSE_SOURCE 会自动关闭传入的 InputStream 或 Reader true
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 +
                    '}';
        }
    }
}

到此,相信大家对“Jackson中的JSON Configure()方法怎么用”有了更深的了解,不妨来实际操作一番吧!这里是本站网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

《Jackson中的JSON Configure()方法怎么用.doc》

下载本文的Word格式文档,以方便收藏与打印。