如何獲取json某一級節點的數據


如何獲取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;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM