zoukankan      html  css  js  c++  java
  • 如何获取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;
        }
  • 相关阅读:
    git(1)-git关联GitHub-windows-转载
    jenkins(4)-jenkins配置邮件通知
    jenkins(3)-linux下安装jenkins(yum install方式)
    【PAT甲级】1090 Highest Price in Supply Chain (25 分)(DFS)
    【PAT甲级】1087 All Roads Lead to Rome (30 分)(MAP【int,string】,邻接表,DFS,模拟,SPFA)
    【PAT甲级】1018 Public Bike Management (30 分)(DFS,SPFA)
    Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
    Atcoder Grand Contest 032C(欧拉回路,DFS判环)
    Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
    Atcoder Grand Contest 031C(构造,思维,异或,DFS)
  • 原文地址:https://www.cnblogs.com/CodingJacob/p/12431825.html
Copyright © 2011-2022 走看看