直播平台开发,序列化时实现任意类型自定义转换

直播平台开发,序列化时实现任意类型自定义转换

1、前言

在对象进行序列化时,希望对序列化的字段进行格式化处理,比如:Double与String转换、BigDecimal与String转换、Long与Date转换、Long与LocalDateTime转换等不同类型的字段之间实现转换操作;

只需要通过重新定义Jackson的ObjectMapper对象通过addSerializer()添加自定义的序列化转换器即可;

 

2、定义ObjectMapperConverter

ObjectMapperConverter:

 

1
<br>import com.fasterxml.jackson.core.JsonGenerator;<br>import com.fasterxml.jackson.core.JsonProcessingException;<br>import com.fasterxml.jackson.databind.JsonSerializer;<br>import com.fasterxml.jackson.databind.ObjectMapper;<br>import com.fasterxml.jackson.databind.SerializerProvider;<br>import com.fasterxml.jackson.databind.module.SimpleModule;<br>import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;<br>import com.lhz.demo.converter.DataConverterConfig;<br>import java.io.IOException;<br>import java.math.BigDecimal;<br>import java.math.BigInteger;<br>import java.text.DecimalFormat;<br>import java.text.SimpleDateFormat;<br>import java.time.LocalDateTime;<br>import java.time.ZoneId;<br>import java.util.Date;<br>/**<br> * @Description: 在json时进行转换操作, 比如:忽略null值字段进行序列化\BigDecimal格式化\Date格式化\基本类型转为String等操作<br> **/<br>public class ObjectMapperConverter {<br>    private static ObjectMapper objectMapper;<br>    private ObjectMapperConverter() {<br>    }<br>    public static synchronized ObjectMapper getInstance() {<br>        if (objectMapper == null) {<br>            objectMapper = new ObjectMapper();<br>            SimpleModule module = new SimpleModule();<br>            // 禁止null值字段进行序列化<br>            // 如果有需要则进行使用<br>            // objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);<br>            // 添加默认序列化,将字段转化为转换String,支持各种可以直接使用toString()方法的类型<br>            // 如果有需要则进行开启<br>            //  module.addSerializer(BigInteger.class, new ToStringSerializer());<br>            //  module.addSerializer(Long.class, new ToStringSerializer());<br>            //  module.addSerializer(Integer.class, new ToStringSerializer());<br>            //  module.addSerializer(BigInteger.class, new ToStringSerializer());<br>            // 添加自定义序列化 Serializer<br>            module.addSerializer(BigDecimal.class, new BigDecimalSerializer());<br>            module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());<br>            module.addSerializer(Date.class, new DateSerializer());<br>            objectMapper.registerModule(module);<br>            return objectMapper;<br>        }<br>        return objectMapper;<br>    }<br>    public static String toJsonString(Object value) {<br>        try {<br>            return getInstance().writeValueAsString(value);<br>        } catch (JsonProcessingException e) {<br>            e.printStackTrace();<br>        }<br>        return null;<br>    }<br>    /**<br>     * 序列化实现BigDecimal转化为String<br>     */<br>    private static class BigDecimalSerializer extends JsonSerializer<BigDecimal> {<br>        @Override<br>        public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers)<br>                throws IOException {<br>            String res = null;<br>            if (value != null) {<br>                int scale = value.scale();<br>                if (scale > 2) {<br>                    res = value.toString();<br>                } else {<br>                    DecimalFormat df = new DecimalFormat("#0.00");<br>                    res = df.format(value);<br>                }<br>                gen.writeString(res);<br>            }<br>        }<br>    }<br>    /**<br>     * 序列化实现 LocalDateTime转化为Long<br>     */<br>    private static class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {<br>        @Override<br>        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers)<br>                throws IOException {<br>            if (value != null) {<br>                long timestamp = value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();<br>                gen.writeNumber(timestamp);<br>            }<br>        }<br>    }<br>    /**<br>     * 序列化实现 Date转化为String<br>     */<br>    private static class DateSerializer extends JsonSerializer<Date> {<br>        @Override<br>        public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {<br>            if (value != null) {<br>                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br>                String format = df.format(value);<br>                gen.writeString(format);<br>            }<br>        }<br>    }<br>}

 

3、定义序列化实体

 

1
@Data<br>public class TestEntity {<br>    private Long id;<br>    private Integer num;<br>    private BigInteger count;<br>    private BigDecimal price;<br>    private LocalDateTime createTime;<br>    private Date time;<br>}

 

以上就是直播平台开发,序列化时实现任意类型自定义转换的全部代码,更多内容请关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2021-10-19 短视频系统,不改变背景颜色的基础上更改边框和字体颜色
2021-10-19 直播系统开发,Flutter创建圆圈图标按钮
2021-10-19 直播电商源码,利用Kotlin+RocketMQ 实现延时消息
点击右上角即可分享
微信分享提示