json之jackson的常用全局配置以及自定义序列化规则

配置序列化时日期类型的格式不为时间戳

// 序列化设置 关闭日志输出为时间戳的设置
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)

配置

  1. 引入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>
  1. 全局增加配置
// 自动查找并注册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

  1. 自定义序列化规则
/**
 * 自定义序列化规则
 */
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));
    }
}
  1. 使用@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"}

自定义反序列化规则与@JsonDeserialize

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容