直播平台开发,序列化时实现任意类型自定义转换
直播平台开发,序列化时实现任意类型自定义转换
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>} |
以上就是直播平台开发,序列化时实现任意类型自定义转换的全部代码,更多内容请关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-10-19 短视频系统,不改变背景颜色的基础上更改边框和字体颜色
2021-10-19 直播系统开发,Flutter创建圆圈图标按钮
2021-10-19 直播电商源码,利用Kotlin+RocketMQ 实现延时消息