😊 @ 作者: 一恍过去
⏱️ @ 创作时间: 2022年10月12日
目录
- 1、前言
- 2、定义ObjectMapperConverter
- 3、定义序列化实体
- 4、测试效果
1、前言
Jackson序列化:用于将 Java 对象与 JSON 格式之间进行转换。它提供了简单易用的 API,可用于在 Java 应用程序中进行对象的序列化和反序列化操作。
在对象进行序列化时,希望对序列化的字段进行格式化处理,比如:Double与String转换、BigDecimal与String转换、Long与Date转换、Long与LocalDateTime转换等不同类型的字段之间实现转换操作;
只需要通过重新定义Jackson
的ObjectMapper
对象通过addSerializer()
添加自定义的序列化转换器即可;
2、定义ObjectMapperConverter
通过自定义的
Converter
转换器,实现在进行Json序列化操作时,在将对象序列化为Json字符串时进行数据类型之间的转换,比如:LocalDateTime转化为Long、BigDecimal转化为String
,通过调用toJsonString()
方法,会根据Java对象的类型进行自动识别转换
ObjectMapperConverter:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.lhz.demo.converter.DataConverterConfig;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
/**
* @Description: 在json时进行转换操作, 比如:忽略null值字段进行序列化\BigDecimal格式化\Date格式化\基本类型转为String等操作
**/
public class ObjectMapperConverter {
private static ObjectMapper objectMapper;
private ObjectMapperConverter() {
}
public static synchronized ObjectMapper getInstance() {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
// 禁止null值字段进行序列化
// 如果有需要则进行使用
// objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 添加默认序列化,将字段转化为转换String,支持各种可以直接使用toString()方法的类型
// 如果有需要则进行开启
// module.addSerializer(BigInteger.class, new ToStringSerializer());
// module.addSerializer(Long.class, new ToStringSerializer());
// module.addSerializer(Integer.class, new ToStringSerializer());
// module.addSerializer(BigInteger.class, new ToStringSerializer());
// 添加自定义序列化 Serializer
module.addSerializer(BigDecimal.class, new BigDecimalSerializer());
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
module.addSerializer(Date.class, new DateSerializer());
objectMapper.registerModule(module);
return objectMapper;
}
return objectMapper;
}
public static String toJsonString(Object value) {
try {
return getInstance().writeValueAsString(value);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 序列化实现BigDecimal转化为String
*/
private static class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
String res = null;
if (value != null) {
int scale = value.scale();
if (scale > 2) {
res = value.toString();
} else {
DecimalFormat df = new DecimalFormat("#0.00");
res = df.format(value);
}
gen.writeString(res);
}
}
}
/**
* 序列化实现 LocalDateTime转化为Long
*/
private static class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
if (value != null) {
long timestamp = value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
gen.writeNumber(timestamp);
}
}
}
/**
* 序列化实现 Date转化为String
*/
private static class DateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value != null) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = df.format(value);
gen.writeString(format);
}
}
}
}
转换器其他用法:
- 禁止null值字段进行序列化:
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
- 添加默认序列化,将字段转化为转换String,支持各种可以直接使用toString()方法的类型
module.addSerializer(BigInteger.class, new ToStringSerializer());
module.addSerializer(Long.class, new ToStringSerializer());
module.addSerializer(Integer.class, new ToStringSerializer());
module.addSerializer(BigInteger.class, new ToStringSerializer());
3、定义序列化实体
@Data
public class TestEntity {
private Long id;
private Integer num;
private BigInteger count;
private BigDecimal price;
private LocalDateTime createTime;
private Date time;
}
4、测试效果
编写测试类:
public class Main {
public static void main(String[] args) {
TestEntity test = new TestEntity();
test.setId(System.currentTimeMillis());
test.setNum(12);
test.setCount(new BigInteger("10"));
test.setCreateTime(LocalDateTime.now());
test.setPrice(new BigDecimal("12.1"));
test.setTime(new Date());
String string = ObjectMapperConverter.toJsonString(res);
System.out.println(string);
}
}
执行结果:
效果:
- 在序列化后,
Id、num、count
字段序列化时将转化为String
类型数据;Price
字段序列化时将进行保留两位小数
createTime
字段序列化时将转化为时间戳
time
字段序列化时将进行格式化为yyyy-MM-dd HH:mm:ss
格式
效果: