千家信息网

jackson中怎么自定义全局序列化、反序列化

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章将为大家详细讲解有关jackson中怎么自定义全局序列化、反序列化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、创建序列化类创建一个序列化
千家信息网最后更新 2025年12月03日jackson中怎么自定义全局序列化、反序列化

这篇文章将为大家详细讲解有关jackson中怎么自定义全局序列化、反序列化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、创建序列化类

创建一个序列化类然后继承JsonSerializer,重写serialize序列化方法。其中第一个参数localDateTime为JsonSerializer的泛型,表示的是被序列化的类型的值,第二个参数jsonGenerator表示的是用于输出生成的Json内容,第三个参数暂时没明白什么应用场景。重写方法一般是将想要序列化的字符串传入 jsonGenerator.writeString。

public final class LocalDateTimeSerializer extends JsonSerializer {    public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer();    public LocalDateTimeSerializer() {    }    @Override    public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {        jsonGenerator.writeString(DateUtil.format(localDateTime, DateUtil.DateTimeFormatEnum.DATE_TIME_FORMAT_4));    }}

二、创建反序列化类

创建两个类,一个类继承JsonDeserializer,一个类继承KeyDeserializer,重写deserialize反序列化方法。参数jsonParser用于读取json内容的解析,deserializationContext可用于访问此有关反序列化的上下文(暂时也不知道怎么用),返回值则是JsonDeserializer的泛型对象,表示要反序列化的对象。一般用法是通过jsonParser.getText().trim()获取该字段json字符串,然后将该字符串转换为对象返回。

public final class LocalTimeDeserializer extends JsonDeserializer {    public static final LocalTimeDeserializer INSTANCE = new LocalTimeDeserializer();    public LocalTimeDeserializer() {    }    @Override    public LocalTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {        String text = jsonParser.getText().trim();        return LocalTime.parse(text, DateUtil.DATE_TIME_FORMATTER_6);    }}
public final class LocalDateTimeKeyDeserializer extends KeyDeserializer {    public static final LocalDateTimeKeyDeserializer INSTANCE = new LocalDateTimeKeyDeserializer();    public LocalDateTimeKeyDeserializer() {    }    @Override    public Object deserializeKey(String s, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {        return StringUtils.isBlank(s) ? null : LocalDateTime.parse(s, DateUtil.DATE_TIME_FORMATTER_4);    }}

三、将两个类注册进入jackson核心对象objectMapper

@Beanpublic ObjectMapper objectMapper(){        ObjectMapper objectMapper = new ObjectMapper();        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        //不注释,会导致swagger报错        //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        //关闭日期序列化为时间戳的功能        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);        //关闭序列化的时候没有为属性找到getter方法,报错        objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);        //关闭反序列化的时候,没有找到属性的setter报错        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);        //序列化的时候序列对象的所有属性        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);        //反序列化的时候如果多了其他属性,不抛出异常        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);        //如果是空对象的时候,不抛异常        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);        SimpleModule simpleModule = new SimpleModule();        //json值序列化        simpleModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);        //json值反序列化        simpleModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);        //json键序列化        simpleModule.addKeySerializer(LocalDateTime.class,LocalDateTimeSerializer.INSTANCE);        //json键反序列化        simpleModule.addKeyDeserializer(LocalDateTime.class, LocalDateTimeKeyDeserializer.INSTANCE);        objectMapper.registerModule(simpleModule);        return objectMapper;    }

关于jackson中怎么自定义全局序列化、反序列化就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0