配置序列化时日期类型的格式不为时间戳
// 序列化设置 关闭日志输出为时间戳的设置
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
// 日期输出格式
2021-10-19T10:25:46.605
java.util.Date类型默认输出的时UTC时区的时间
配置反序列化忽略多余字段
// 反序列化设置 关闭反序列化时Jackson发现无法找到对应的对象字段,便会抛出UnrecognizedPropertyException: Unrecognized field xxx异常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
配置采用直接处理字段的方式序列化反序列化
// 设置序列化反序列化采用直接处理字段的方式, 不依赖setter 和 getter
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
配置支持java8的类型以及新的日期时间API
不配置
使用Java8的数据类型(比如:LocalDateTime)会报以下异常
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: com.bj.json.bean.jackson.TestSchool["createTime"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300)
at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4569)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3822)
at com.bj.json.util.JacksonUtil.objectToJson(JacksonUtil.java:42)
at com.bj.json.Application.main(Application.java:44)
配置
- 引入jar包
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.13.0</version>
</dependency>
- 全局增加配置
// 自动查找并注册Java 8相关模块
objectMapper.findAndRegisterModules();
全部常用配置
ObjectMapper objectMapper = new ObjectMapper()
// 设置序列化反序列化采用直接处理字段的方式, 不依赖setter 和 getter
.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
// 反序列化设置 关闭反序列化时Jackson发现无法找到对应的对象字段,便会抛出UnrecognizedPropertyException: Unrecognized field xxx异常
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
// 序列化设置 关闭日志输出为时间戳的设置
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
// 自动查找并注册Java 8相关模块
.findAndRegisterModules();
自定义序列化规则与@JsonSerialize
- 自定义序列化规则
/**
* 自定义序列化规则
*/
public class CustomSerialize extends JsonSerializer<Double> {
private static final DecimalFormat decimalFormat = new DecimalFormat("##.00");
@Override
public void serialize(Double aDouble, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(decimalFormat.format(aDouble));
}
}
- 使用@JsonSerialize绑定自定义的序列化规则
@AllArgsConstructor
public class TestSchool {
// @JsonSerialize 此注解用于属性或者getter方法上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。
@JsonSerialize(using = CustomSerialize.class)
private Double area;
}
3.结果
// 测试数据
TestSchool testSchool = new TestSchool(3000.45678);
// 序列化结果
{"area":"3000.46"}