package com.example.erp.tools;
|
|
import com.fasterxml.jackson.core.JacksonException;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.databind.JavaType;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
import org.springframework.boot.json.JsonParseException;
|
|
import java.util.List;
|
import java.util.concurrent.Callable;
|
|
|
// 将繁琐的异常处理进行了解决
|
public class JacksonUtil {
|
/**
|
* 工具类不需要创建实例对象
|
*/
|
private JacksonUtil(){
|
|
}
|
|
/**
|
* 给ObjectMapper进行单例模式,由于ObjectMapper 是线程安全的,可以复用,放置重复创建影响性能
|
*/
|
private static final ObjectMapper objectMapper;
|
|
static {
|
objectMapper = new ObjectMapper();
|
objectMapper.registerModule(new JavaTimeModule());
|
|
}
|
|
public static ObjectMapper getObjectMapper(){
|
|
return objectMapper;
|
}
|
|
public static final <T> T tryParse(Callable<T> parser) {
|
return JacksonUtil.tryParse(parser, JacksonException.class);
|
}
|
|
public static final <T> T tryParse(Callable<T> parser, Class<? extends Exception> check) {
|
try {
|
return parser.call();
|
}
|
catch (Exception ex) {
|
if (check.isAssignableFrom(ex.getClass())) {
|
throw new JsonParseException(ex);
|
}
|
throw new IllegalStateException(ex);
|
}
|
}
|
|
// 普通对象和List对象共同使用
|
public static String writeValueAsString(Object object){
|
return JacksonUtil.tryParse(()->{
|
return JacksonUtil.getObjectMapper().writeValueAsString(object);
|
});
|
}
|
|
// 普通对象的反序列化
|
public static <T> T readValue(String str,Class<T> valueType){
|
return JacksonUtil.tryParse(()->{
|
return JacksonUtil.getObjectMapper().readValue(str,valueType);
|
});
|
}
|
|
|
|
public static <T> T readValueObjectToString(Object object,TypeReference<T> valueType){
|
String str = JacksonUtil.tryParse(()->{
|
return JacksonUtil.getObjectMapper().writeValueAsString(object);
|
});
|
|
return JacksonUtil.tryParse(()->{
|
return JacksonUtil.getObjectMapper().readValue(str,valueType);
|
});
|
}
|
|
|
// List类型的反序列化
|
public static <T> T readListValue(String str,Class<?> valueType){
|
JavaType javaType = JacksonUtil.getObjectMapper().getTypeFactory().constructParametricType(List.class,valueType);
|
return JacksonUtil.tryParse(()->{
|
return JacksonUtil.getObjectMapper().readValue(str,javaType);
|
});
|
}
|
|
}
|