😊 @ 作者: 一恍过去

⏱️ @ 创作时间: 2022年10月12日


目录

  • 1、前言
  • 2、定义ObjectMapperConverter
  • 3、定义序列化实体
  • 4、测试效果


maven jackson实体类转换json jackson 类型转换_格式转换器

1、前言

Jackson序列化:用于将 Java 对象与 JSON 格式之间进行转换。它提供了简单易用的 API,可用于在 Java 应用程序中进行对象的序列化和反序列化操作。

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

只需要通过重新定义JacksonObjectMapper对象通过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());
  • maven jackson实体类转换json jackson 类型转换_序列化_02


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格式

效果:

maven jackson实体类转换json jackson 类型转换_字段_03

maven jackson实体类转换json jackson 类型转换_格式转换器_04