Jackson 是當(dāng)前用的比較廣泛的,用來序列化和反序列化 json 的 Java 的開源框架。下面文章將和大家講講 Jackson中的json中的Configure()方法的詳細內(nèi)容。
1. #configure(JsonParser.Feature, boolean):
功能名稱 | 描述 | 默認值 |
---|---|---|
AUTO_CLOSE_SOURCE | 會自動關(guān)閉傳入的 InputStream 或 Reader | true |
ALLOW_COMMENTS | 允許在 JSON 中使用 Java/C++ 風(fēng)格的注釋。 | false |
ALLOW_YAML_COMMENTS | 允許在 JSON 中使用 YAML 樣式的注釋。 | false |
ALLOW_UNQUOTED_FIELD_NAMES | 允許寫不帶引號的字段 | false |
ALLOW_SINGLE_QUOTES | 允許使用撇號、字符 '\'' 而不是標(biāo)準(zhǔn)引號 | false |
STRICT_DUPLICATE_DETECTION | 如果找到重復(fù)的字段,則拋出異常 | false |
IGNORE_UNDEFINED | 在未找到輸入內(nèi)容包含的屬性的定義的情況下使用。在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 | 會自動關(guān)閉傳入的 InputStream 或 Reader | true |
AUTO_CLOSE_JSON_CONTENT | 如果生成器關(guān)閉,確定如何處理 JsonToken.START_ARRAY 或 JsonToken.START_OBJECT。如果啟用,這些元素會自動關(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 | 如果沒有關(guān)于必填字段的信息,將拋出 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 將如下所示:
如果啟用 JSON 將如下所示:
| false |
INDENT_OUTPUT | 將縮進輸出 JSON 字符串。 如果禁用 JSON 將如下所示:
如果啟用 JSON 將如下所示:
| 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 | 將拋出異常,如果對象具有類型信息但它被標(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(也是子類型)將被序列化為時間戳。如果禁用,將使用 ISO-8601 進行序列化(例如:2021-06-20T10:22:34.364+00:00) | false |
WRITE_DATES_WITH_ZONE_ID | 如果啟用,則包括時區(qū)信息。例如: 2011-12-03T10:15:30+01:00[歐洲/巴黎] | false |
WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS | 如果啟用會將 char[] 作為 JSON 數(shù)組,
如果禁用將其寫為子字符串
| false |
WRITE_ENUMS_USING_TO_STRING | 這兩個配置配置了枚舉序列化為 JSON 的方式。 如果啟用 WRITE_ENUMS_USING_TO_STRING 并且禁用 WRITE_ENUMS_USING_INDEX,它將使用 toString() 序列化枚舉
| false |
WRITE_ENUMS_USING_INDEX | 如果禁用 WRITE_ENUMS_USING_TO_STRING 并啟用 WRITE_ENUMS_USING_INDEX,它將使用 Enum.ordinal() 序列化枚舉
| false |
WRITE_ENUM_KEYS_USING_INDEX | 如果啟用,它將使用 Enum.ordinal() 將 Map 中使用的枚舉序列化為鍵
如果禁用,它將使用 Enum.toString() 序列化枚舉
| false |
WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED | 如果啟用,則不會將包含一個元素的 List 轉(zhuǎn)換為 JSON 數(shù)組
如果禁用,它會將具有一個元素的 List 轉(zhuǎn)換為 JSON 數(shù)組
| false |
WRITE_DATE_TIMESTAMPS_AS_NANOOSECONDS | 如果啟用,將以納秒為單位寫入日期時間戳。
如果禁用,
| true |
ORDER_MAP_ENTRIES_BY_KEYS | 如果啟用,將在序列化之前按鍵對 Map 條目進行排序。如果禁用,則不會執(zhí)行排序。 | false |
EAGER_SERIALIZER_FETCH | 如果啟用,ObjectWriter 將嘗試急切地獲取必要的 JsonSerializer-s。 | true |
USE_EQUALITY_FOR_OBJECT_ID | 如果啟用,將使用 Object.equal() 方法作為對象標(biāo)識。 如果禁用,將使用真正的 JVM 級別標(biāo)識作為對象標(biāo)識。 | 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,它將反序列化浮點數(shù)為 BigDecimal;如果禁用,它將被反序列化為 Double。 | false |
USE_BIG_INTEGER_FOR_INTS | 如果啟用且字段類型為 Object 或 Number,它將反序列化非浮點數(shù)為 BigInteger。如果禁用,將使用最緊湊的變體。 | false |
USE_LONG_FOR_INTS | 如果啟用并且字段類型為 Object 或 Number,它將反序列化非浮點數(shù)為 Long;如果禁用,將使用最緊湊的變體。 | false |
USE_JAVA_ARRAY_FOR_JSON_ARRAY | 如果啟用并且字段類型未知,例如 Object,Jackson 會將 JSON 數(shù)組反序列化為 Object[];如果禁用,將反序列化為 List<Object> | false |
FAIL_ON_UNKNOWN_PROPERTIES | 如果啟用,如果發(fā)現(xiàn)未知屬性,Jackson 將拋出異常。如果禁用將忽略這樣的字段。 | true |
FAIL_ON_NULL_FOR_PRIMITIVES | 如果啟用,如果 JSON 包含原始類型的空值,Jackson 將拋出異常。如果禁用默認值(如 0.0、0 等)將被使用。 | false |
FAIL_ON_NUMBERS_FOR_ENUMS | 如果啟用,如果 JSON 包含枚舉的數(shù)字值,Jackson 將拋出異常。如果禁用該值將與 Enum.ordinal() 匹配 | false |
FAIL_ON_READING_DUP_TREE_KEY | 如果啟用,如果找到重復(fù)的樹鍵將失敗。如果禁用,則不會引發(fā)異常,并且后面的值會覆蓋前面的值。 | 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 | 如果啟用,如果一個或多個字段作為null 傳遞給構(gòu)造函數(shù)或靜態(tài)工廠方法,將引發(fā)異常。如果禁用,將忽略此類情況。 | false |
WRAP_EXCEPTIONS | 如果啟用,Jackson 將捕獲反序列化期間拋出的異常,并通過提供附加信息將其與 Jackson 異常包裝在一起。如果禁用將拋出原始異常。 | true |
ACCEPT_SINGLE_VALUE_AS_ARRAY | 如果啟用 Jackson 將接受單個值作為數(shù)組。如果禁用,則將拋出異常。 | false |
UNWRAP_SINGLE_VALUE_ARRAYS | 如果啟用,它將解包單個值數(shù)組并將其反序列化為相應(yīng)的數(shù)據(jù)類型。如果禁用,將拋出異常。 | false |
UNWRAP_ROOT_VALUE | 如果啟用,它將解包根值。這意味著它將接受這樣的 JSON
作為
| false |
ACCEPT_EMPTY_STRING_AS_NULL_OBJECT | 如果啟用,對于空字符串,如果與 POJO 字段數(shù)據(jù)類型不匹配,Jackson 將不會失敗
和 JSON 看起來像那樣
Jackson 將設(shè)置 null 而不是拋出異常。 | false |
ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT | 如果啟用,Jackson 不會在與 POJO 字段數(shù)據(jù)類型不匹配的情況下失敗,對于空字符串
和 JSON 看起來像那樣 {“age”:[]} Jackson 將設(shè)置 null 而不是拋出異常。 | false |
ACCEPT_FLOAT_AS_INT | 如果啟用,將通過截斷數(shù)字將浮點數(shù)轉(zhuǎn)換為非浮點數(shù)(如 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 | 如果啟用,它將設(shè)置為使用 @JsonEnumDefaultValue 值預(yù)定義的未知枚舉值。如果禁用,它將拋出異常。 | false |
READ_DATE_TIMESTAMPS_AS_NANOOSECONDS | 如果啟用,杰克遜將期望以納秒為單位寫入時間戳。如果禁用,時間戳預(yù)計以毫秒為單位。 | true |
ADJUST_DATES_TO_CONTEXT_TIME_ZONE | 如果啟用,它將調(diào)整日期屬性時區(qū)。如果禁用,則只會在值本身不包含時區(qū)時進行調(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 +
'}';
}
}
}