Spring項目中如何自定義序列化工具
在編寫web項目的場景下:
序列化:服務器端處理完業(yè)務邏輯后,需要將數(shù)據(jù)(如對象)轉(zhuǎn)換為客戶端能夠理解的格式(通常是JSON),這個過程就是序列化。序列化后的數(shù)據(jù)可以通過HTTP響應發(fā)送給客戶端。
反序列化:客戶端接收到服務器的響應后,需要將這些數(shù)據(jù)(通常是JSON或XML格式的字符串)轉(zhuǎn)換回客戶端程序能夠處理的對象,這個過程就是反序列化。
使用案例
所有的序列化和反序列化都是基于ObjectMapper的,序列化調(diào)用writeValue方法(如果是json數(shù)據(jù),使用writeValueAsString),反序列化調(diào)用readValue
編寫測試類
@SpringBootTest public class JacksonTest { @Test void jacksonTest() { //定義ObjectMapper(所有的序列化和反序列化都是基于ObjectMapper) ObjectMapper objectMapper = new ObjectMapper(); CommonResult<String> result = CommonResult.error(500, "系統(tǒng)錯誤"); String str; //序列化,把對象序列化成String //其實就是把對象轉(zhuǎn)成json字符串 try { str = objectMapper.writeValueAsString(result); System.out.println(str); } catch (JsonProcessingException e) { throw new RuntimeException(e); } //反序列化(就是把json字符串轉(zhuǎn)換成對象) CommonResult<String> commonResult = null;//參數(shù)2:要轉(zhuǎn)換成的對象 try { commonResult = objectMapper.readValue(str, CommonResult.class); } catch (JsonProcessingException e) { throw new RuntimeException(e); } System.out.println(commonResult.getCode() + "," + commonResult.getMsg()); //List序列化 //定義List對象 List<CommonResult<String>> commonResults = Arrays.asList(CommonResult.success("success1"), CommonResult.success("success2")); try { str = objectMapper.writeValueAsString(commonResults); } catch (JsonProcessingException e) { throw new RuntimeException(e); } //List反序列化 JavaType javaType = objectMapper. getTypeFactory().//獲取類型工廠 constructParametricType(List.class, CommonResult.class);//構(gòu)造List的類型,List<CommonResult<String>> try { commonResults = objectMapper.readValue(str, javaType); for (CommonResult<String> results : commonResults) { System.out.println(results.getData()); } } catch (JsonProcessingException e) { throw new RuntimeException(e); } } }
自定義序列化工具
在使用案例中,我們發(fā)現(xiàn)在代碼中出現(xiàn)了很多try catch,這樣顯得代碼很不雅觀,我們可以借鑒SpringBoot的方法,具體的操作看代碼
public class JacksonUtil { private JacksonUtil() { } //對ObjectMapper進行單例化操作 private final static ObjectMapper OBJECT_MAPPER; static { //初始化OBJECT_MAPPER OBJECT_MAPPER = new ObjectMapper(); } //get方法 private static ObjectMapper getObjectMapper() { return OBJECT_MAPPER; } private static <T> T tryParse(Callable<T> parser) { return tryParse(parser, JacksonException.class); } //借鑒SpringBoot統(tǒng)一異常 //Callable<T> parser,這個參數(shù),支持我們使用lambda表達式進行處理 private static <T> T tryParse(Callable<T> parser, Class<? extends Exception> check) { try { return parser.call(); } catch (Exception var4) { Exception ex = var4; if (check.isAssignableFrom(ex.getClass())) { throw new JsonParseException(ex); } throw new IllegalStateException(ex); } } /** * 序列化方法 * * @param o * @return */ public static String writeValueAsString(Object o) { return JacksonUtil.tryParse(() -> { //執(zhí)行序列化的操作 //如果此處出現(xiàn)異常,直接會在tryParse這里捕獲 return JacksonUtil.getObjectMapper().writeValueAsString(o); }); } /** * 反序列化Object方法 * * @param content * @param valueType * @param <T> * @return */ public static <T> T readValue(String content, Class<T> valueType) { return JacksonUtil.tryParse(() -> { return JacksonUtil.getObjectMapper().readValue(content, valueType); }); } /** * 反序列化List * * @param content * @param paramClasses * @param <T> * @return */ public static <T> T readListValue(String content, Class<?> paramClasses) { //1.構(gòu)造JavaType JavaType javaType = JacksonUtil.getObjectMapper(). getTypeFactory().//獲取類型工廠 constructParametricType(List.class, paramClasses);//構(gòu)造List的類型 //2.反序列化 return JacksonUtil.tryParse(() -> { return JacksonUtil.getObjectMapper().readValue(content, javaType); }); } }
到此這篇關于Spring項目中如何自定義序列化工具的文章就介紹到這了,更多相關Spring自定義序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java修飾符abstract與static及final的精華總結(jié)
abstract、static、final三個修飾符是經(jīng)常會使用的,對他們的概念必須非常清楚,弄混了會產(chǎn)生些完全可以避免的錯誤,比如final和abstract不能一同出現(xiàn),static和abstract不能一同出現(xiàn),下面我們來詳細了解2022-04-04Maven構(gòu)建SpringBoot集成MyBatis過程
文章介紹了如何使用Maven創(chuàng)建一個Spring Boot項目,并集成MyBatis,首先,配置Maven環(huán)境,然后在pom.xml中添加MyBatis依賴,配置數(shù)據(jù)庫連接信息,最后生成Mapper XML文件和DAO層代碼2024-11-11Spring data jpa @Query update的坑及解決
這篇文章主要介紹了Spring data jpa @Query update的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02