使用递归方法遍历json中所有的key:value

最近被一个问题难到过,业务提出将数据库中存储的json整体解析出来,提取需要的key以供数据分析。

问题是json的格式大体一致,但是细节方面多有不同,比如

{key1:[{key:value,key:value,key:value},{key:value,key:value,key:value}{key:value,key:value,key:value}],key:value,key:{key:value,key[{key:value},{key:value}]}}

{key1:[{key:value,key:value},{key:value,key:value,key:value}{key:value,key:value,key:value,key:value}],key:value,key:{key:value,key[{key:value},{key:value}]}}

大量类似类似于这样的json,一开始使用if else 来判断发现这样代码量太大,判断的key针对整个数据库数百万条数据来说总是不全。于是就想找一个通用办法来解析。

public static void jsonIterator(String json, List<String>list ) {
		//如果字符串中没有":"说明json中不可能是json
		if (json.indexOf(":")==-1) {
			return;
		}
		//判断传入数据是否是一个json数组
		if (json.startsWith("[{")) {
			JSONArray jsonArray = JSONArray.fromObject(json);
			for (int i = 0; i < jsonArray.size(); i++) {
				jsonIterator(json, list);
			}
		}else {
			JSONObject jsonObject = JSONObject.fromObject(json);
			Iterator<String> iterator = jsonObject.keys();
			while (iterator.hasNext() ) {
				String key = iterator.next().toString();
				String val = jsonObject.getString(key);
				//如果value的值是一个josnarray 或者是jsonobject则再次递归
				if (val.startsWith("[{")||val.startsWith("{")) {
					jsonIterator(json, list);
				}else {
					list.add(key+":"+val);
				}
			}
		}
	}

以上方法也可以将list改成map,当然只适用key不重复的情况。各位道友可以酌情修改

经验分享 程序员 微信小程序 职场和发展