使用递归方法遍历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不重复的情况。各位道友可以酌情修改
上一篇:
IDEA上Java项目控制台中文乱码
