最近需要把一个Json里面的所有键值对给拿出来,也就是把复杂Json的层次结构给去除,只留下叶子节点的键值,方便我们循环输出。这里只是输出了键值对,如有需要请把键值对存成数组。
这里采用递归的方式去遍历打印叶子节点。
代码如下:
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* @date 2019/11/27 10:29
*/
public class JsonMap {
public static void main(String[] args) throws Throwable {
String dataJson = "{\"region\":\"hunan\",\"time\":\"2019-11-09 15:05:26\",\"BoundingBox\":{\"coordinates\":[[[122.00749,49.721016],[127.629456,49.07307],[120.820076,45.93104],[115.49415,46.546955],[122.00749,49.721016]]],\"type\":\"polygon\"}}";
JSONObject jb = JSONObject.parseObject(dataJson);
printNode(jb);
}
public static void printNode(JSONObject jb){
for(String key : jb.keySet()) {
if(jb.get(key) instanceof JSONObject){
JSONObject childJb = JSONObject.parseObject(String.valueOf(jb.get(key)));
printNode(childJb);
}else if(jb.get(key) instanceof JSONArray){
JSONArray childArr = (JSONArray) jb.get(key);
System.out.println(key+":"+childArr);
}else{
System.out.println(key+":"+jb.get(key));
}
}
}
}
由于键是不固定的,所以采用判断节点的类型:
1、如果是JSONObject,表示还没有到底层,继续递归;
2、如果是JSONArray,表示是一个数组对象,我们直接拿出来就行;
3、如果是String类型,表示是根节点,直接输出。
测试数据如下:
{
"region": "hunan",
"time": "2019-11-09 15:05:26",
"BoundingBox": {
"coordinates": [
[
[
122.00749,
49.721016
],
[
127.629456,
49.07307
],
[
120.820076,
45.93104
],
[
115.49415,
46.546955
],
[
122.00749,
49.721016
]
]
],
"type": "polygon"
}
}
输出如下:
coordinates:[[[122.00749,49.721016],[127.629456,49.07307],[120.820076,45.93104],[115.49415,46.546955],[122.00749,49.721016]]]
type:polygon
time:2019-11-09 15:05:26
region:hunan