package com.cht.common.utils;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.io.IOException;
import java.text.SimpleDateFormat;
/**
* @ClassName JsonUtil
* @Description TODO
* @Author YuanJiaLe
* @Date 2024/1/5 10:45
* @PackageName com.common.utils
* @Version 1.0.0
*/
public class JsonUtil {
private static final ObjectMapper mapper;
static {
//创建ObjectMapper对象
mapper = new ObjectMapper();
//configure方法 配置一些需要的参数
// 转换为格式化的json 显示出来的格式美化
mapper.enable(SerializationFeature.INDENT_OUTPUT);
//序列化的时候序列对象的那些属性
//JsonInclude.Include.NON_DEFAULT 属性为默认值不序列化
//JsonInclude.Include.ALWAYS 所有属性
//JsonInclude.Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//JsonInclude.Include.NON_NULL 属性为NULL 不序列化
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);//优化无效字节数
//反序列化时,遇到未知属性会不会报错
//true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//如果是空对象的时候,不抛异常
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 忽略 transient 修饰的属性
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
//修改序列化后日期格式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//处理不同的时区偏移格式
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.registerModule(new JavaTimeModule());
}
public static ObjectMapper getMapper() {
return mapper;
}
public static String toJsonString(Object obj) {
if (null != obj) {
try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
return "";
}
public static <T> T toBean(String json, Class<T> clazz) {
if (StrUtil.isNotBlank(json) && null != clazz) {
try {
return (T) mapper.readValue(json, clazz);
} catch (IOException e) {
}
}
return null;
}
}
测试 把数据序列化和反序列化 耗时,性能对比
在数据为:
10条的List时,hutool和jackson的性能差不多,
到数据1000的时候jackson性能比hutool提升2-3倍!
如果公司正常使用json序列化,无大数据量情况使用hutool也行,没有对比阿里的fastjson,是因为公司禁止使用!