解決Jackson反序列化map,set等復(fù)雜類(lèi)型問(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。
再拓展開(kāi)來(lái),其實(shí)當(dāng)你的Map里面的對(duì)象如果是object類(lèi)型的自定義類(lèi)型,其實(shí)都會(huì)報(bào)錯(cuò),無(wú)法被強(qiáng)轉(zhuǎn),那么我們就需要指定jackson反序列化為什么類(lèi)型,而不是讓它自主決定反序列化成什么類(lèi)型,需要用到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ù)雜類(lèi)型(List,map)兩種方法
方法一
String jsonString="[{'id':'1'},{'id':'2'}]"; ObjectMapper mapper = new ObjectMapper(); JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, Bean.class); //如果是Map類(lèi)型 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ù)雜類(lèi)型問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Cloud 服務(wù)網(wǎng)關(guān)Zuul的實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud 服務(wù)網(wǎng)關(guān)Zuul的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)的示例代碼
泛型是JAVA重要的特性,使用泛型編程,可以使代碼復(fù)用率提高。本文將利用泛型實(shí)現(xiàn)簡(jiǎn)單的棧結(jié)構(gòu),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08SpringBoot如何配置MySQL和Oracl雙數(shù)據(jù)源(Mybatis)
這篇文章主要介紹了SpringBoot如何配置MySQL和Oracl雙數(shù)據(jù)源(Mybatis)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03學(xué)習(xí)在一臺(tái)新電腦上配置JAVA開(kāi)發(fā)環(huán)境
本文主要介紹了如何在一臺(tái)新電腦上配置JAVA開(kāi)發(fā)環(huán)境,每一個(gè)步驟都有對(duì)應(yīng)的截圖和文字說(shuō)明,需要的朋友可以參考下2015-07-07關(guān)于Java整合RabbitMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)的7種通訊方式
這篇文章主要介紹了關(guān)于Java整合RabbitMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)的7種通訊方式,消息中間件是基于隊(duì)列與消息傳遞技術(shù),在網(wǎng)絡(luò)環(huán)境中為應(yīng)用系統(tǒng)提供同步或異步、可靠的消息傳輸?shù)闹涡攒浖到y(tǒng),需要的朋友可以參考下2023-05-05淺談Java中的final關(guān)鍵字與C#中的const, readonly關(guān)鍵字
下面小編就為大家?guī)?lái)一篇淺談Java中的final關(guān)鍵字與C#中的const, readonly關(guān)鍵字。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10Java編程枚舉類(lèi)實(shí)戰(zhàn)代碼分享
這篇文章主要介紹了Java編程枚舉類(lèi)實(shí)戰(zhàn)代碼分享,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-11-11springboot 運(yùn)行 jar 包讀取外部配置文件的問(wèn)題
這篇文章主要介紹了springboot 運(yùn)行 jar 包讀取外部配置文件,本文主要描述linux系統(tǒng)執(zhí)行jar包讀取jar包同級(jí)目錄的外部配置文件,主要分為兩種方法,每種方法通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07