记一次解析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 

猜你喜欢

转载自blog.csdn.net/fuhaiqiang123/article/details/105750581