五分钟学会如何封装Jsckson工具类
前言:在 Java 开发中,JSON 是一种非常常见的数据格式,而 Jackson 是处理 JSON 的主流库之一,为了提高代码的复用性、可维护性,我们通常会将 Jackson 的操作封装成一个工具类,简化使用。
✨✨✨这里是秋刀鱼不做梦的BLOG
✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客
目录
1.创建JacksonUtil工具类并私有化其构造函数
2.将ObjectMapper单例化
3.简化异常捕获
4.对常用方法进行封装
5.JacksonUtil工具类代码
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);});}}
以上就是本篇文章的全部内容了~~~