解決Jackson反序列化map,set等復(fù)雜類型問(wèn)題
工作中遇到了這個(gè)問(wèn)題,我簡(jiǎn)單的用代碼復(fù)現(xiàn)一下,就是一個(gè)map,value又為一個(gè)set,導(dǎo)致反序列化報(bào)錯(cuò)
@Test
public void test10() throws Exception {
//準(zhǔn)備一下數(shù)據(jù)
Map<String, Set<String>> map = new HashMap<>();
map.put("aaa",new HashSet<String>(){{add("111");add("222");}});
ObjectMapper om = new ObjectMapper();
String str01 = om.writeValueAsString(map);
//System.out.println(str01); // {"aaa":["111","222"]}
// 正常反序列化,未報(bào)錯(cuò)
Map<String, Set<String>> map01 = om.readValue(str01, Map.class);
// 取值的時(shí)候就會(huì)報(bào)錯(cuò)了
Set<String> aaa = map01.get("aaa");
}
報(bào)錯(cuò):
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Set
報(bào)錯(cuò)信息:無(wú)法將list轉(zhuǎn)為set。
再拓展開來(lái),其實(shí)當(dāng)你的Map里面的對(duì)象如果是object類型的自定義類型,其實(shí)都會(huì)報(bào)錯(cuò),無(wú)法被強(qiáng)轉(zhuǎn),那么我們就需要指定jackson反序列化為什么類型,而不是讓它自主決定反序列化成什么類型,需要用到TypeReference,直接上代碼。
@Test
public void test10() throws Exception {
//準(zhǔn)備一下數(shù)據(jù)
Map<String, Set<String>> map = new HashMap<>();
map.put("aaa",new HashSet<String>(){{add("111");add("222");}});
ObjectMapper om = new ObjectMapper();
String str01 = om.writeValueAsString(map);
//System.out.println(str01); // {"aaa":["111","222"]}
Map<String, Set<String>> m = om.readValue(str01, new TypeReference<HashMap<String, Set<String>>>() {});
Set<String> aaa = m.get("aaa");
System.out.println(aaa instanceof HashSet); // true
}
補(bǔ)充知識(shí):Jackson 處理復(fù)雜類型(List,map)兩種方法
方法一
String jsonString="[{'id':'1'},{'id':'2'}]";
ObjectMapper mapper = new ObjectMapper();
JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, Bean.class);
//如果是Map類型 mapper.getTypeFactory().constructParametricType(HashMap.class,String.class, Bean.class);
List<Bean> lst = (List<Bean>)mapper.readValue(jsonString, javaType);
當(dāng)轉(zhuǎn)換完成時(shí)一定要用這個(gè)轉(zhuǎn)換對(duì)象,如果不用這個(gè)對(duì)象是沒(méi)有值的.如下,當(dāng)我打印時(shí)這個(gè)projects對(duì)象才有值,否則projects無(wú)值 .
List<AlertProjectInfo> projects = mapper.readValue(subProject, mapper.getTypeFactory().constructCollectionType(List.class, AlertProjectInfo.class)); System.out.println(projects.size());
方法二
String jsonString="[{'id':'1'},{'id':'2'}]";
ObjectMapper mapper = new ObjectMapper();
List<Bean> beanList = mapper.readValue(jsonString, new TypeReference<List<Bean>>() {});
以上這篇解決Jackson反序列化map,set等復(fù)雜類型問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis數(shù)據(jù)脫敏的實(shí)現(xiàn)方案介紹
在我們數(shù)據(jù)庫(kù)中有些時(shí)候會(huì)保存一些用戶的敏感信息,比如:手機(jī)號(hào)、銀行卡等信息,如果這些信息以明文的方式保存,那么是不安全的2022-08-08
Lombok如何快速構(gòu)建JavaBean與日志輸出
這篇文章主要介紹了Lombok如何快速構(gòu)建JavaBean與日志輸出,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java判斷一個(gè)時(shí)間是否在當(dāng)前時(shí)間區(qū)間代碼示例
這篇文章主要給大家介紹了關(guān)于使用Java判斷一個(gè)時(shí)間是否在當(dāng)前時(shí)間區(qū)間的相關(guān)資料,在日常開發(fā)中我們經(jīng)常會(huì)涉及到時(shí)間的大小比較或者是判斷某個(gè)時(shí)間是否在某個(gè)時(shí)間段內(nèi),需要的朋友可以參考下2023-07-07
Log4j詳細(xì)使用教程_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Log4j的使用教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
SpringBoot整合SpringSecurity實(shí)現(xiàn)JWT認(rèn)證的項(xiàng)目實(shí)踐
本文會(huì)通過(guò)創(chuàng)建SpringBoot項(xiàng)目整合SpringSecurity,實(shí)現(xiàn)完整的JWT認(rèn)證機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
SpringSecurity解決POST方式下CSRF問(wèn)題
本文主要介紹了SpringSecurity解決POST方式下CSRF問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

