首页 > 其他分享 >Jackson给给指定类设置序列化规则

Jackson给给指定类设置序列化规则

时间:2023-12-21 14:33:47浏览次数:50  
标签:Jackson jsonGenerator void JsonSerializer 指定 class new 序列化 public

背景

业务中需要对返回给APP端的数据进行特殊处理,包括:

  • null值转换成空字符串
  • 日期(LocalDateTime)类型转换成时间戳
  • 金额根据用户Locale做格式化

需要保证不影响内部其他服务的互相调用,因此让所有返回给APP的VO对象实现自定义的Vo接口,然后指定对Vo接口的类进行对应的转换。

实现com.fasterxml.jackson.databind.JsonSerializer接口实现序列化方式

public class AppVoSerializer extends JsonSerializer<Vo> {
    private final ObjectMapper objectMapper = new ObjectMapper();

    public AppVoSerializer() {
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString(Strings.EMPTY);
            }
        });
        SimpleModule simpleModule = new SimpleModule("customerSerializationModule", new Version(1, 0, 0, "static version", "", ""));
        simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
        simpleModule.addSerializer(BigDecimal.class, new BigDecimalSerializer());
        objectMapper.registerModule(simpleModule);
    }

    @Override
    public void serialize(Vo appVo, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeObject(new JSONObject(objectMapper.writeValueAsString(appVo)));
    }
}

实现org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer接口指定类

@Configuration
public class JacksonConfig implements Jackson2ObjectMapperBuilderCustomizer {
    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.serializerByType(Vo.class, new AppVoSerializer());
    }
}

附上LocalDateTimeSerializer

public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
    @Override
    public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        long timestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
        jsonGenerator.writeString(String.valueOf(timestamp / 1000));
    }
}

附上BigDecimalSerializer

public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        Locale locale = ThreadContext.getUser().getUserLocale();
        NumberFormat numberFormat = DecimalFormat.getInstance(locale);
        String format = numberFormat.format(bigDecimal);
        jsonGenerator.writeString(format);
    }
}

标签:Jackson,jsonGenerator,void,JsonSerializer,指定,class,new,序列化,public
From: https://www.cnblogs.com/nickhan/p/17918962.html

相关文章

  • Fastjson2基础使用以及底层序列化/反序列化实现探究
    来自于:https://www.cnblogs.com/6b7b5fc3/p/17134421.html1Fastjson2简介Fastjson2是Fastjson的升级版,特征:协议支持:支持JSON/JSONB两种协议部分解析:可以使用JSONPath进行部分解析获取需要的值语言支持:Java/Kotlin场景支持:Android8+/服务端其他特性支持:GraalNative-Image......
  • 通过指定日期获取本周五,上周五 本周一上周一
    通过指定日期获取本周五,上周五 周一,周二,周三,周四,周五,周六,周日,对应0,1,2,3,4,5,6 --本周五SELECTDATE_FORMAT(DATE_SUB('2023-12-28',INTERVALWEEKDAY('2023-12-28')-4DAY),'%Y%m%d')ASmonday--上周五selectDATE_SUB(DATE_SUB('2023-12-21'......
  • 记录 | ubuntu升级/降级/安装指定版本的vim
    安装安装依赖:sudoaptinstallgitmakeclanglibtool-bin下载源码:gitclone--depth=1https://github.com/vim/vim.gitvim_sourcecdvim也可以从http://github.com/vim/vim/tags下载,在我写这篇笔记的时候最新的版本是v8.2.4995wget-chttps://github.com/vim/vim/archive/......
  • vue上传图片到指定文件夹
    vue代码<template><divclass="app-container"> <divclass="wenben"><el-upload:disabled="dis==0?true:false"class="upload-demo":action="uploadUrl":on-......
  • drf之序列化类
    序列化类介绍1序列化qs对象,单个对象做序列化给前端2反序列化数据校验:前端传入数据---》校验数据是否合法3反序列化---》前端传入数据,存到数据库中#因为咱么在写接口时,需要序列化,需要反序列化,而且反序列化的过程中要做数据校验---》drf直接提供了固定的写法,只要按照固......
  • Externalizable接口实现序列化与反序列化
    Externalizable接口实现序列化与反序列化packagecom.example.core.mydemo.java;importcom.example.core.mydemo.json2.GsonUtils;importjava.io.*;/***Externalizable接口实现序列化与反序列化**Serialization(序列化):将java对象以一连串的字节保存在磁盘文件......
  • Java序列化和反序列化 Serializable BeanUtils.copyProperties赋值属性方法
    Java序列化和反序列化SerializableBeanUtils.copyProperties赋值属性方法packagecom.example.core.mydemo.java;importcom.example.core.mydemo.json2.GsonUtils;importorg.springframework.beans.BeanUtils;importjava.io.*;/***Java序列化和反序列化Serializ......
  • 【代码块】-结构体序列化与反序列化
    整理代码块代码块整理后存储,供后期使用结构体序列化与反序列化usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Text;namespacestructTest{///<summary>///结构体序列化///</summary>publicclassstructSerializable{......
  • c# - 如何在自定义 System.Text.Json JsonConverter 中使用默认序列化?
    我正在写一个 custom System.Text.Json.JsonConverter 将旧数据模型升级到新版本。我已覆盖 Read()并实现了必要的后处理。但是,我根本不需要在 Write() 中做任何自定义操作。方法。如果我根本没有转换器,如何自动生成默认序列化?显然我可以使用不同的 JsonSerializerOption......
  • js 处理对象数组 + map 筛选出指定字段数据 + filter过滤重复数据/指定数据
    constres=[{id:1,name:'zhangsan',age:16,gender:0},{id:1,name:'zhangsan',age:16,gender:0},{id:2,name:'lisi',age:20,gender:1}];获取res中的id和name/*[{"id&......