Spring項(xiàng)目中如何自定義序列化工具
在編寫(xiě)web項(xiàng)目的場(chǎng)景下:
序列化:服務(wù)器端處理完業(yè)務(wù)邏輯后,需要將數(shù)據(jù)(如對(duì)象)轉(zhuǎn)換為客戶端能夠理解的格式(通常是JSON),這個(gè)過(guò)程就是序列化。序列化后的數(shù)據(jù)可以通過(guò)HTTP響應(yīng)發(fā)送給客戶端。
反序列化:客戶端接收到服務(wù)器的響應(yīng)后,需要將這些數(shù)據(jù)(通常是JSON或XML格式的字符串)轉(zhuǎn)換回客戶端程序能夠處理的對(duì)象,這個(gè)過(guò)程就是反序列化。
使用案例
所有的序列化和反序列化都是基于ObjectMapper的,序列化調(diào)用writeValue方法(如果是json數(shù)據(jù),使用writeValueAsString),反序列化調(diào)用readValue
編寫(xiě)測(cè)試類
@SpringBootTest
public class JacksonTest {
@Test
void jacksonTest() {
//定義ObjectMapper(所有的序列化和反序列化都是基于ObjectMapper)
ObjectMapper objectMapper = new ObjectMapper();
CommonResult<String> result = CommonResult.error(500, "系統(tǒng)錯(cuò)誤");
String str;
//序列化,把對(duì)象序列化成String
//其實(shí)就是把對(duì)象轉(zhuǎn)成json字符串
try {
str = objectMapper.writeValueAsString(result);
System.out.println(str);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
//反序列化(就是把json字符串轉(zhuǎn)換成對(duì)象)
CommonResult<String> commonResult = null;//參數(shù)2:要轉(zhuǎn)換成的對(duì)象
try {
commonResult = objectMapper.readValue(str,
CommonResult.class);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
System.out.println(commonResult.getCode() + "," + commonResult.getMsg());
//List序列化
//定義List對(duì)象
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() {
}
//對(duì)ObjectMapper進(jìn)行單例化操作
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,這個(gè)參數(shù),支持我們使用lambda表達(dá)式進(jìn)行處理
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)異常,直接會(huì)在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);
});
}
}
到此這篇關(guān)于Spring項(xiàng)目中如何自定義序列化工具的文章就介紹到這了,更多相關(guān)Spring自定義序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
Java修飾符abstract與static及final的精華總結(jié)
abstract、static、final三個(gè)修飾符是經(jīng)常會(huì)使用的,對(duì)他們的概念必須非常清楚,弄混了會(huì)產(chǎn)生些完全可以避免的錯(cuò)誤,比如final和abstract不能一同出現(xiàn),static和abstract不能一同出現(xiàn),下面我們來(lái)詳細(xì)了解2022-04-04
Maven構(gòu)建SpringBoot集成MyBatis過(guò)程
文章介紹了如何使用Maven創(chuàng)建一個(gè)Spring Boot項(xiàng)目,并集成MyBatis,首先,配置Maven環(huán)境,然后在pom.xml中添加MyBatis依賴,配置數(shù)據(jù)庫(kù)連接信息,最后生成Mapper XML文件和DAO層代碼2024-11-11
Spring data jpa @Query update的坑及解決
這篇文章主要介紹了Spring data jpa @Query update的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02

