如何獲取json某一級節點的數據
最近做項目有獲取和設置固定格式某一級節點值的需求。但是要一級一級地取對於多級的結構來說代碼過於冗余且重復,於是寫了個遞歸的方法根據json路徑完成值的定點操作。廢話不多說直接貼代碼。
/**
* 通用的 通過json路徑找到json值
* @param jsonObject 要取值的json對象
* @param path 對象路徑
* @return 對象值列表 由於可能存在A.B.C路徑中B為列表的情況,所以結果可能有多個
*/
public static List<Object> getJsonFieldValue(JSONObject jsonObject, String path) {
List<String> keyWordList = new ArrayList(Arrays.asList(path.split("\\.")));
List<Object> list = new ArrayList<>();
String key = keyWordList.get(0);
Object object = jsonObject.get(key);
keyWordList.remove(0);
if (keyWordList.isEmpty()) {
if (null != object) {
list.add(object);
}
return list;
}
String subPath = StringUtils.join(keyWordList, ".");
if (object instanceof JSONArray) {
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(object));
if (jsonArray.isEmpty()) {
return new ArrayList<>();
}
jsonArray.forEach(e -> list.addAll(getJsonFieldValue(JSON.parseObject(JSON.toJSONString(e)), subPath)));
}else if(object instanceof JSONObject){
JSONObject subJsonObject = JSONObject.parseObject(JSON.toJSONString(object));
list.addAll(getJsonFieldValue(JSON.parseObject(JSON.toJSONString(subJsonObject)), subPath));
}
return list;
}
/**
* 通用的 通過json路徑找到json值
* @param jsonObject 要取值的json對象
* @param path 對象路徑
* @param value 要設置的值
* @return 修改后的對象
*/
public static Object setJsonFieldValue(JSONObject jsonObject, String path, Object value) {
List<String> keyWordList = new ArrayList(Arrays.asList(path.split("\\.")));
String key = keyWordList.get(0);
keyWordList.remove(0);
//如果關鍵詞為空,說明此處為目標點,設置值
if (keyWordList.isEmpty()) {
jsonObject.fluentPut(key,value);
return jsonObject;
}
//關鍵詞不為空,取出子jsonObject進行遞歸
Object object = jsonObject.get(key);
String subPath = StringUtils.join(keyWordList, ".");
if (object instanceof JSONArray) {
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(object));
if (jsonArray.isEmpty()) {
//說明不是目標點,原樣返回
return object;
}
JSONArray newArray = new JSONArray();
jsonArray.forEach(e -> newArray.add(setJsonFieldValue(JSON.parseObject(JSON.toJSONString(e)), subPath,value)));
jsonObject.fluentPut(key,newArray);
}else if(object instanceof JSONObject){
JSONObject subJsonObject = JSONObject.parseObject(JSON.toJSONString(object));
jsonObject.fluentPut(key,setJsonFieldValue(JSON.parseObject(JSON.toJSONString(subJsonObject)), subPath,value));
}
return jsonObject;
}