Jackson 中的 JSON 中的 Configure() 方法
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。下面文章将和大家讲讲 Jackson中的json中的Configure()方法的详细内容。
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 将如下所示:
如果启用 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 | 将抛出异常,如果对象具有类型信息但它被标记为 @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 数组,
如果禁用将其写为子字符串
| 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 转换为 JSON 数组
如果禁用,它会将具有一个元素的 List 转换为 JSON 数组
| false |
WRITE_DATE_TIMESTAMPS_AS_NANOOSECONDS | 如果启用,将以纳秒为单位写入日期时间戳。
如果禁用,
| 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
作为
| false |
ACCEPT_EMPTY_STRING_AS_NULL_OBJECT | 如果启用,对于空字符串,如果与 POJO 字段数据类型不匹配,Jackson 将不会失败
和 JSON 看起来像那样
Jackson 将设置 null 而不是抛出异常。 | false |
ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT | 如果启用,Jackson 不会在与 POJO 字段数据类型不匹配的情况下失败,对于空字符串
和 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 +
'}';
}
}
}