App下載

Jackson 中的 JSON 中的 Configure() 方法

閃城棒棒軍 2021-08-27 10:29:26 瀏覽數(shù) (5179)
反饋

Jackson 是當(dāng)前用的比較廣泛的,用來(lái)序列化和反序列化 json 的 Java 的開(kāi)源框架。下面文章將和大家講講 Jackson中的json中的Configure()方法的詳細(xì)內(nèi)容。

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

功能名稱描述默認(rèn)值
AUTO_CLOSE_SOURCE會(huì)自動(dòng)關(guān)閉傳入的 InputStream 或 Readertrue
ALLOW_COMMENTS允許在 JSON 中使用 Java/C++ 風(fēng)格的注釋。 false
ALLOW_YAML_COMMENTS允許在 JSON 中使用 YAML 樣式的注釋。 false
ALLOW_UNQUOTED_FIELD_NAMES 允許寫不帶引號(hào)的字段false
ALLOW_SINGLE_QUOTES允許使用撇號(hào)、字符 '\'' 而不是標(biāo)準(zhǔn)引號(hào)false
STRICT_DUPLICATE_DETECTION如果找到重復(fù)的字段,則拋出異常false
IGNORE_UNDEFINED在未找到輸入內(nèi)容包含的屬性的定義的情況下使用。在JSON解析的情況下沒(méi)有作用 false
INCLUDE_SOURCE_IN_LOCATION在 JsonLocation 中包含源參考信息。如果該功能被禁用,則會(huì)打印 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):

功能名稱描述默認(rèn)值
AUTO_CLOSE_TARGET會(huì)自動(dòng)關(guān)閉傳入的 InputStream 或 Reader true
AUTO_CLOSE_JSON_CONTENT 如果生成器關(guān)閉,確定如何處理 JsonToken.START_ARRAY 或 JsonToken.START_OBJECT。如果啟用,這些元素會(huì)自動(dòng)關(guān)閉;如果禁用,則不執(zhí)行任何特定操作 true
FLUSH_PASSED_TO_STREAM如果啟用調(diào)用 JsonGenerator#flush 將具有與 OutputStream 或 Writer 中的 flush() 相同的效果  true
WRITE_BIGDECIMAL_AS_PLAIN將使用 BigDecimal.toPlainString() 將 BigDecimal 寫為純文本  false
STRICT_DUPLICATE_DETECTION 如果找到重復(fù)的字段,則拋出異常 false
IGNORE_UNKNOWN如果沒(méi)有關(guān)于必填字段的信息,將拋出 JsonProcessingException。序列化 JSON 時(shí)無(wú)效。 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):

功能名稱描述默認(rèn)值
WRAP_ROOT_VALUE

如果啟用將包裝根值。該功能主要用于 JAXB 兼容性。

如果禁用 JSON 將如下所示:

{"name":"Ali Z"}

如果啟用 JSON 將如下所示:

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

將縮進(jìn)輸出 JSON 字符串。

如果禁用 JSON 將如下所示:

{"name":"Ali Z"}

如果啟用 JSON 將如下所示:

{"name":"Ali Z"}
false
FAIL_ON_EMPTY_BEANS如果沒(méi)有像 getter 這樣的字段的訪問(wèn)器,則會(huì)拋出異常。  true
FAIL_ON_SELF_REFERENCES如果在 POJO 對(duì)象中檢測(cè)到直接自引用,將拋出特定于 Jackson 的異常。注意如果它被禁用它可能會(huì)拋出 StackOverflowError true
WRAP_EXCEPTIONS如果啟用,Jackson 將捕獲序列化期間拋出的異常,并通過(guò)提供附加信息將其與 Jackson 異常包裝起來(lái)。如果禁用將拋出原始異常。 false
FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS將拋出異常,如果對(duì)象具有類型信息但它被標(biāo)記為 @JsonUnwrapped。如果禁用類型信息將被忽略 true
WRITE_SELF_REFERENCES_AS_NULL將自我導(dǎo)向的引用寫為 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(也是子類型)將被序列化為時(shí)間戳。如果禁用,將使用 ISO-8601 進(jìn)行序列化(例如:2021-06-20T10:22:34.364+00:00)false
WRITE_DATES_WITH_ZONE_ID

如果啟用,則包括時(shí)區(qū)信息。例如:

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

如果啟用會(huì)將 char[] 作為 JSON 數(shù)組,

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

如果禁用將其寫為子字符串

{"surname":"Zhagparov"}
false
WRITE_ENUMS_USING_TO_STRING

這兩個(gè)配置配置了枚舉序列化為 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

如果啟用,則不會(huì)將包含一個(gè)元素的 List 轉(zhuǎn)換為 JSON 數(shù)組

{"stringList":"Ali Z"}

如果禁用,它會(huì)將具有一個(gè)元素的 List 轉(zhuǎn)換為 JSON 數(shù)組

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

如果啟用,將以納秒為單位寫入日期時(shí)間戳。

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

如果禁用,

{“date”:[2021,6,20,14,17,12,990000000]}
true
ORDER_MAP_ENTRIES_BY_KEYS 如果啟用,將在序列化之前按鍵對(duì) Map 條目進(jìn)行排序。如果禁用,則不會(huì)執(zhí)行排序。 false
EAGER_SERIALIZER_FETCH如果啟用,ObjectWriter 將嘗試急切地獲取必要的 JsonSerializer-s。  true
USE_EQUALITY_FOR_OBJECT_ID

如果啟用,將使用 Object.equal() 方法作為對(duì)象標(biāo)識(shí)。

如果禁用,將使用真正的 JVM 級(jí)別標(biāo)識(shí)作為對(duì)象標(biāo)識(shí)。 

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):

功能名稱描述默認(rèn)值
USE_BIG_DECIMAL_FOR_FLOATS如果啟用且字段類型為 Object 或 Number,它將反序列化浮點(diǎn)數(shù)為 BigDecimal;如果禁用,它將被反序列化為 Double。 false
USE_BIG_INTEGER_FOR_INTS如果啟用且字段類型為 Object 或 Number,它將反序列化非浮點(diǎn)數(shù)為 BigInteger。如果禁用,將使用最緊湊的變體。 false
USE_LONG_FOR_INTS如果啟用并且字段類型為 Object 或 Number,它將反序列化非浮點(diǎn)數(shù)為 Long;如果禁用,將使用最緊湊的變體。 false
USE_JAVA_ARRAY_FOR_JSON_ARRAY如果啟用并且字段類型未知,例如 Object,Jackson 會(huì)將 JSON 數(shù)組反序列化為 Object[];如果禁用,將反序列化為 List<Object> false
FAIL_ON_UNKNOWN_PROPERTIES如果啟用,如果發(fā)現(xiàn)未知屬性,Jackson 將拋出異常。如果禁用將忽略這樣的字段。 true
FAIL_ON_NULL_FOR_PRIMITIVES如果啟用,如果 JSON 包含原始類型的空值,Jackson 將拋出異常。如果禁用默認(rèn)值(如 0.0、0 等)將被使用。 false
FAIL_ON_NUMBERS_FOR_ENUMS如果啟用,如果 JSON 包含枚舉的數(shù)字值,Jackson 將拋出異常。如果禁用該值將與 Enum.ordinal() 匹配 false
FAIL_ON_READING_DUP_TREE_KEY如果啟用,如果找到重復(fù)的樹鍵將失敗。如果禁用,則不會(huì)引發(fā)異常,并且后面的值會(huì)覆蓋前面的值。 false
FAIL_ON_IGNORED_PROPERTIES如果啟用并且 JSON 包含顯式標(biāo)記為可忽略的值,則將引發(fā)異常。如果禁用,這些字段將被忽略。 false
FAIL_ON_MISSING_CREATOR_PROPERTIES如果啟用,如果 JSON 數(shù)據(jù)字段未在 POJO 中描述,Jackson 將拋出異常。如果禁用,將為未知字段設(shè)置 null。false
FAIL_ON_NULL_CREATOR_PROPERTIES如果啟用,如果一個(gè)或多個(gè)字段作為null 傳遞給構(gòu)造函數(shù)或靜態(tài)工廠方法,將引發(fā)異常。如果禁用,將忽略此類情況。false
WRAP_EXCEPTIONS如果啟用,Jackson 將捕獲反序列化期間拋出的異常,并通過(guò)提供附加信息將其與 Jackson 異常包裝在一起。如果禁用將拋出原始異常。 true
ACCEPT_SINGLE_VALUE_AS_ARRAY如果啟用 Jackson 將接受單個(gè)值作為數(shù)組。如果禁用,則將拋出異常。 false
UNWRAP_SINGLE_VALUE_ARRAYS如果啟用,它將解包單個(gè)值數(shù)組并將其反序列化為相應(yīng)的數(shù)據(jù)類型。如果禁用,將拋出異常。 false
UNWRAP_ROOT_VALUE

如果啟用,它將解包根值。這意味著它將接受這樣的 JSON

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

作為

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

如果啟用,對(duì)于空字符串,如果與 POJO 字段數(shù)據(jù)類型不匹配,Jackson 將不會(huì)失敗

public static class Person{
    private int age;
}

和 JSON 看起來(lái)像那樣 

{“age”:””}

Jackson 將設(shè)置 null 而不是拋出異常。

false
ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT

如果啟用,Jackson 不會(huì)在與 POJO 字段數(shù)據(jù)類型不匹配的情況下失敗,對(duì)于空字符串

public static class Person{    private int age;
}

和 JSON 看起來(lái)像那樣

{“age”:[]}

Jackson 將設(shè)置 null 而不是拋出異常。

false
ACCEPT_FLOAT_AS_INT如果啟用,將通過(guò)截?cái)鄶?shù)字將浮點(diǎn)數(shù)轉(zhuǎn)換為非浮點(diǎn)數(shù)(如 Long、long、int 等)。 true
READ_ENUMS_USING_TO_STRING如果啟用,它將使用字符串反序列化 Enum。如果禁用,將使用 Enum.ordinal(); false
READ_UNKNOWN_ENUM_VALUES_AS_NULL如果啟用,它會(huì)將未知的枚舉值反序列化為 null。如果禁用將拋出異常。 false
READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE如果啟用,它將設(shè)置為使用 @JsonEnumDefaultValue 值預(yù)定義的未知枚舉值。如果禁用,它將拋出異常。 false
READ_DATE_TIMESTAMPS_AS_NANOOSECONDS如果啟用,杰克遜將期望以納秒為單位寫入時(shí)間戳。如果禁用,時(shí)間戳預(yù)計(jì)以毫秒為單位。 true
ADJUST_DATES_TO_CONTEXT_TIME_ZONE如果啟用,它將調(diào)整日期屬性時(shí)區(qū)。如果禁用,則只會(huì)在值本身不包含時(shí)區(qū)時(shí)進(jìn)行調(diào)整。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 +
                    '}';
        }
    }
}


0 人點(diǎn)贊