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;
        }
  • 相关阅读:
    cuda实践2
    对旋转矩阵R做(行)初等变换会发生什么?
    关于最短路径问题:Dijkstra与Floyd算法
    深入理解JavaScript系列
    jquery的$.extend和$.fn.extend作用及区别
    知道WCF的地址用工厂通道方式快速调用WCF
    WCF大数据量传输解决方案
    系统上线后WCF服务最近经常死掉的原因分析总结
    Microsoft Web Application Stress Tool 使用
    标识符解析在闭包中理解
  • 原文地址:https://www.cnblogs.com/CodingJacob/p/12431825.html
Copyright © 2011-2022 走看看