前言:在 Java 开发中,JSON 是一种非常常见的数据格式,而 Jackson 是处理 JSON 的主流库之一,为了提高代码的复用性、可维护性,我们通常会将 Jackson 的操作封装成一个工具类,简化使用。
✨✨✨这里是秋刀鱼不做梦的BLOG
✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客
目录
1.创建JacksonUtil工具类并私有化其构造函数
对于封装的工具类,我们不需要创建其实例对象,我们一般都直接使用其静态方法即可,所以我们将其构造函数进行私有化。
private JacksonUtil(){}
2.将ObjectMapper单例化
由于ObjectMapper在多线程环境下是线程安全的,所以我们在使用的时候只需要创建一个实例对象即可,所以我们将ObjectMapper单例化。
/**
* 给ObjectMapper进行单例模式,由于ObjectMapper 是线程安全的,可以复用,放置重复创建影响性能
*/
private static final ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper();
}
public static ObjectMapper getObjectMapper(){
return objectMapper;
}
3.简化异常捕获
由于在使用ObjectMapper中的方法的时候,会抛出异常,如果我们手动的try-catch会十分的麻烦,所以我们借鉴java内部对异常的简化。
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);
}
}
4.对常用方法进行封装
最后,我们对常用方法进行封装即可。
// 普通对象和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);
});
}
// 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);
});
}
5.JacksonUtil工具类代码
以下是封装JacksonUtil工具类的整体代码:
package com.test.lotterysystem.Comment.Utils;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.json.JsonParseException;
import org.springframework.util.ReflectionUtils;
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();
}
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);
});
}
// 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);
});
}
}
以上就是本篇文章的全部内容了~~~