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



作者:若有所思_若有所悟
链接:https://www.jianshu.com/p/a77da42e1be4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,我们可以使用 Jackson 库来实现 LocalDateTime 类型的序列化和反序列化。下面是全局配置的示例代码: ```java import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); ``` 这里,我们创建了 ObjectMapper 对象,并注册了 JavaTimeModule,该模块支持 Java 8 中的日期和时间 API。然后,我们禁用了将日期序列化为时间戳的选项。 接下来,我们可以使用这个 ObjectMapper 对象来进行 LocalDateTime 类型的序列化和反序列化。例如,如果我们要将一个 LocalDateTime 对象序列化JSON 字符串,可以这样做: ```java LocalDateTime dateTime = LocalDateTime.now(); String json = objectMapper.writeValueAsString(dateTime); ``` 如果我们要将一个表示 LocalDateTime 的 JSON 字符串反序列化为 LocalDateTime 对象,可以这样做: ```java String json = "{\"year\":2021,\"month\":\"JULY\",\"dayOfMonth\":12,\"hour\":14,\"minute\":30,\"second\":0,\"nano\":0}"; LocalDateTime dateTime = objectMapper.readValue(json, LocalDateTime.class); ``` 这里,我们使用了 readValue 方法来将 JSON 字符串反序列化为 LocalDateTime 对象。注意,我们需要指定要反序列化的目标类型,即 LocalDateTime.class。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值