記一次解析json的無奈及想到更好的方法,實現json解析公共方法分享

最近接到一個比較重要項目,由於需要對接多家第三方部門或者平臺,難免會使用各種變身大法、出大招各種對接方法都搬出來,項目中用到很多json解析的部分、解決異構環境的對接痛點,當然每個部門及對接平臺參差不齊的標準及提供格式各種各樣,讓下游對接認識很是吾乃。。。 只能硬編碼了,下面我們來看一下,一個對接部門返回的無腦json如下:

{"code":0,"message":"成功","result":"[{\"desc\":\"姓名\",\"name\":\"XM\",\"value\":\"徐猗x\"},{\"desc\":\"手機號碼\",\"name\":\"SJH\",\"value\":\"13832162xxx\"},{\"desc\":\"身份證號\",\"name\":\"SFZ\",\"value\":\"11011219970730xxxx\"},{\"desc\":\"性別\",\"name\":\"XB\",\"value\":\"女\"},{\"desc\":\"借款區域\",\"name\":\"HZSQY\",\"value\":\"北京市北京市海淀\"},{\"desc\":\"單位電話\",\"name\":\"DWDH\",\"value\":\"1867876xxxx\"},{\"desc\":\"住宅電話\",\"name\":\"ZZDH\",\"value\":\"\"},{\"desc\":\"父母所在地\",\"name\":\"FMSZD\",\"value\":\"北京市北京市海淀-北京市海淀區\"},{\"desc\":\"婚姻狀況\",\"name\":\"HYZK\",\"value\":\"未婚\"},{\"desc\":\"單位地址\",\"name\":\"DWDZ\",\"value\":\"\"},{\"desc\":\"現居住地\",\"name\":\"XJZD\",\"value\":\"北京市北京市海淀-北京市海淀區\"},{\"desc\":\"信修手機號\",\"name\":\"XXSJH\",\"value\":\"\"},{\"desc\":\"配偶姓名\",\"name\":\"POXM\",\"value\":\"\"},{\"desc\":\"配偶證件號\",\"name\":\"POSFZ\",\"value\":\"\"},{\"desc\":\"配偶手機\",\"name\":\"POSJH\",\"value\":\"\"},[[{\"desc\":\"姓名\",\"name\":\"LXRXM\",\"value\":\"緊急聯繫人1\"},{\"desc\":\"手機號\",\"name\":\"LXRSJH\",\"value\":\"18070542xxx\"},{\"desc\":\"與借款人關係\",\"name\":\"LXRGX\",\"value\":\"親屬\"}],[{\"desc\":\"姓名\",\"name\":\"LXRXM\",\"value\":\"緊急聯繫人2\"},{\"desc\":\"手機號\",\"name\":\"LXRSJH\",\"value\":\"13136614xxx\"},{\"desc\":\"與借款人關係\",\"name\":\"LXRGX\",\"value\":\"親屬\"}],[{\"desc\":\"姓名\",\"name\":\"LXRXM\",\"value\":\"緊急聯繫人3\"},{\"desc\":\"手機號\",\"name\":\"LXRSJH\",\"value\":\"13463141xxx\"},{\"desc\":\"與借款人關係\",\"name\":\"LXRGX\",\"value\":\"親屬\"}]],{\"desc\":\"村委聯繫人\",\"name\":\"CWLXR\",\"value\":\"\"},{\"desc\":\"村委聯繫人電話\",\"name\":\"CWLXRDH\",\"value\":\"\"},{\"desc\":\"行政村村名\",\"name\":\"CM\",\"value\":\"\"}]"}

首先,暫且不說返回問題,既然是json交互,那麼哥們第一點認爲這個result返回的格式帶反斜槓 就是入門級新手提供的,好吧,忍了,繼續解析、那就先把result拿出來看看吧,result比較好處理直接通過json轉換String resultstr = (String) jsonObject.get("result");取出來就好了,如下:

[{"desc":"姓名","name":"XM","value":"徐猗x"},{"desc":"手機號碼","name":"SJH","value":"13832162xxx"},{"desc":"身份證號","name":"SFZ","value":"110112199707303xxx"},{"desc":"性別","name":"XB","value":"女"},{"desc":"借款區域","name":"HZSQY","value":"北京市北京市海淀"},{"desc":"單位電話","name":"DWDH","value":"18678765xxx"},{"desc":"住宅電話","name":"ZZDH","value":""},{"desc":"父母所在地","name":"FMSZD","value":"北京市北京市海淀-北京市海淀區"},{"desc":"婚姻狀況","name":"HYZK","value":"未婚"},{"desc":"單位地址","name":"DWDZ","value":""},{"desc":"現居住地","name":"XJZD","value":"北京市北京市海淀-北京市海淀區"},{"desc":"信修手機號","name":"XXSJH","value":""},{"desc":"配偶姓名","name":"POXM","value":""},{"desc":"配偶證件號","name":"POSFZ","value":""},{"desc":"配偶手機","name":"POSJH","value":""},[[{"desc":"姓名","name":"LXRXM","value":"緊急聯繫人1"},{"desc":"手機號","name":"LXRSJH","value":"18070542xxx"},{"desc":"與借款人關係","name":"LXRGX","value":"親屬"}],[{"desc":"姓名","name":"LXRXM","value":"緊急聯繫人2"},{"desc":"手機號","name":"LXRSJH","value":"1313661xxxx"},{"desc":"與借款人關係","name":"LXRGX","value":"親屬"}],[{"desc":"姓名","name":"LXRXM","value":"緊急聯繫人3"},{"desc":"手機號","name":"LXRSJH","value":"1346314xxxx"},{"desc":"與借款人關係","name":"LXRGX","value":"親屬"}]],{"desc":"村委聯繫人","name":"CWLXR","value":""},{"desc":"村委聯繫人電話","name":"CWLXRDH","value":""},{"desc":"行政村村名","name":"CM","value":""}]

剛開始沒感覺到有啥問題,好吧,繼續解析吧,稍等,ri~ 什麼狀況,看下圖:

這是什麼鬼~ 數組裏面套 object 也就算了 還套了數組,是不是看起來很彆扭?對,第一眼看到的人都會楞半天,這啥玩意兒,試着解析一下吧, 繼續點看數組發現 是一個無厘頭數組,還好自己心理承受能力比較強壯,裏面的Key都一樣,我的個乖乖~ 繼續忍受了吧,出了個難題,也得繼續扒出來吧,雖然不知道數組裏面將來會放進去什麼,但是每次扒三層就知道里面是A?B?C?擔保人?緊急聯繫人?共借人? 實在是無法猜測啊,哥突然覺得很上頭,像喝了二兩二鍋頭,無奈酒量小啊~呵呵,工作還得繼續,好幾個坑等着我們呢,人家都好心好意挖好了,那就跳吧,帶個牀單吧,滾到坑底還可以滾一下牀單,嗚嗚。。。。。

先不管low不low的,先上一段代碼吧,折騰了半天終於解析出來了眉目啦,哈哈

怎麼樣?牛逼不牛逼,每次都不知道數組裏面到底是隱藏的是 神是鬼? 所以啊先來鑑別一下 是畜牲 還是 牲畜 ,然後再解析吧,可是寫完了,總感覺哪裏不對勁呢,看下 解析的MAP吧,我去,吧name當做key啦 啦啦。。。。

可是爲什麼 ,到底是爲什麼,數組沒定義名字也就算了,裏面給的object name 也是重複的,好吧,別急,讓哥先拿把 鵝毛扇 冷靜一下下。。 畢竟剛剛的二兩又開始上頭了,既然知道自己的酒量,下次就喝一兩吧~ 呼呼, 也好,重複也難不住我,看我怎麼拿到你,既然重複是吧,那好吧,就把你重複的塞到一起吧,雖然拒絕合租、羣租,沒辦法~ 哥幾個先將就一下 擠擠 放一個字段吧,先把相同name的 拼接到一起吧,key既然一樣,無所謂啦,按照key取出來總不會是錯的,

JSONObject jsonObject = JSONObject.fromObject(result);
				String resultstr = (String) jsonObject.get("result");
				JSONArray jsarray =  JSONArray.fromObject(resultstr);
				Map<String, String> map = new HashMap<String, String>();
				for(int i=0;i<jsarray.size();i++){
					if( jsarray.get(i) instanceof JSONObject){
						map.put((String) ((JSONObject)jsarray.get(i)).get("name"), (String) ((JSONObject)jsarray.get(i)).get("value"));
					}else{
						JSONArray jsarray1 = (JSONArray) jsarray.get(i);
						String keyName="";
						for(int j=0;j<jsarray1.size();j++){
							JSONArray jsarray2 = (JSONArray) jsarray1.get(j);
							for(int n=0;n<jsarray2.size();n++){
								if( jsarray2.get(n) instanceof JSONObject){
									keyName = (String) ((JSONObject)jsarray2.get(n)).get("name");
									if(null!=map.get(keyName)){
										String keyValue = map.get(keyName)+","+ (String)((JSONObject)jsarray2.get(n)).get("value");
									    map.put(keyName, keyValue);
									}else{
										 map.put(keyName, (String) ((JSONObject)jsarray2.get(n)).get("value"));
									}
								}
							}
						}
					}
				}
				System.out.println("JSONObject==="+JSONObject.fromObject(map));

怎麼樣,說了吧,再難的問題,都好解決吧,取出來看看什麼樣子吧,哈哈

看起來舒服多了吧,使用的時候直接map get(key) 就好啦,ou yeah! 搞定  ,回來檢查一下代碼,總覺得不舒服呢,

好吧,那就再優化一下吧,總不能一直low下去,low不是我們的目標,這麼寫確實感覺很不美觀,也不符合我的做事風格,好吧,停下鵝毛扇吧,再扇扇就感冒啦,感冒了可不能隨便出門了,趁着冷靜下來的頭腦,趕緊優化一下,寫個方法把代碼都消掉吧,簡化一下

既然消除了這麼多代碼,是不是都轉移到了 紅框方法裏面了,太逗了,轉移了一下是不是? 當然不是啦,哈哈

繼續看,小小遞歸是怎麼寫的吧,管他是什麼類型,通吃,吃掉一個鬼,還有一個神?不在乎、繼續吃到鱉爲止,看你假裝什麼,照妖鏡來也~

是不是每次把 array 扔進去,管他裏面有什麼類型 都放到map就好了,是的,簡單分析後 就是這樣,好吧,既然我不知道你數組到底會返回給我多少個,或者數量不固定,或者類型不固定,我都給你接收了吧,name相同的都給你拼接到一起再說

	private Map<String, String> searchKey(Map<String, String> map,JSONArray jsarray) {
		String keyName="";
		for(int i=0;i<jsarray.size();i++){
			if( jsarray.get(i) instanceof JSONObject){
				keyName = (String) ((JSONObject)jsarray.get(i)).get("name");
				if(null!=map.get(keyName)){
					String keyValue = map.get(keyName)+","+ (String)((JSONObject)jsarray.get(i)).get("value");
					map.put(keyName, keyValue);
				}else{
					 map.put(keyName, (String) ((JSONObject)jsarray.get(i)).get("value"));
				}
			}else{
				map=searchKey(map,(JSONArray)jsarray.get(i));
			}
		}
		return map;
	}

好吧,測試一下,ok ou yeah ~ 就是這個路子~ 看看返回值,沒錯跟剛剛返回值一模一樣,簡潔不?好吧,方法抽象出來吧,其他地方一樣使用,哈哈

循環調吧,多少數組,多少object 通吃,統一輸出map 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章