? ? ? ? 前言:在 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);});}}
以上就是本篇文章的全部內容了~~~