zoukankan      html  css  js  c++  java
  • Js解析Json数据获取元素JsonPath与深度


    JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java,JsonPath 对于 JSON 来说,相当于 XPATH 对于 XML。

    (一)JsonPath与Xpath用法对比
    (二)Java使用Jsonpath解析json数据
    (三)Js获取Json每个节点的JsonPath
    (四)将输出结果转换成树形结构

    JsonPath与Xpath用法对比

    XPath JSONPath 描述
    / $ 根节点
    . @ 现行节点
    / .or[] 取子节点
    .. n/a 取父节点,Jsonpath未支持
    // .. 就是不管位置,选择所有符合条件的条件
    * * 匹配所有元素节点
    @ n/a 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要。
    [] [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
    | [,] 支持迭代器中做多选。
    [] ?() 支持过滤操作.
    n/a () 支持表达式计算
    () n/a 分组,JsonPath不支持

    Java使用Jsonpath解析json数据

    引入fastjson依赖

    <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.6</version>
    </dependency>
    

    java简单的解析案例

    public class JsonPath {
        public static void main(String[] args) {
            String jsonStr = "{
    " +
                    "  "store": {
    " +
                    "    "book": [
    " +
                    "      {
    " +
                    "        "category": "reference",
    " +
                    "        "author": "Nigel Rees",
    " +
                    "        "title": "Sayings of the Century",
    " +
                    "        "price": 8.95
    " +
                    "      },
    " +
                    "      {
    " +
                    "        "category": "fiction",
    " +
                    "        "author": "Evelyn Waugh",
    " +
                    "        "title": "Sword of Honour",
    " +
                    "        "price": 12.99,
    " +
                    "        "isbn": "0-553-21311-3"
    " +
                    "      }
    " +
                    "      {
    " +
                    "        "category": "fiction",
    " +
                    "        "author": "Evelyn Waugh",
    " +
                    "        "title": "Sword of Honour two",
    " +
                    "        "price": 12.99,
    " +
                    "        "isbn": "0-553-21311-3"
    " +
                    "      }
    " +
                    "    ],
    " +
                    "    "bicycle": {
    " +
                    "      "color": "red",
    " +
                    "      "price": 19.95
    " +
                    "    }
    " +
                    "  }
    " +
                    "}";
            JSONObject jsonObject = JSON.parseObject(jsonStr);
            System.out.println("Book:" + JSONPath.eval(jsonObject, "$.store.book"));
            System.out.println("Book数目:" + JSONPath.eval(jsonObject, "$.store.book.size()"));
            System.out.println("第一本书title:" + JSONPath.eval(jsonObject, "$.store.book[0].title"));
            System.out.println("price大于10元的book:" + JSONPath.eval(jsonObject, "$.store.book[price > 10]"));
            System.out.println("price大于10元的title:" + JSONPath.eval(jsonObject, "$.store.book[price > 10][0].title"));
            System.out.println("price大于10元的title:" + JSONPath.eval(jsonObject, "$.store.book[price > 10][1].title"));
            System.out.println("category(类别)为fiction(小说)的book:" + JSONPath.eval(jsonObject, "$.store.book[category = 'fiction']"));
            System.out.println("bicycle的所有属性值" + JSONPath.eval(jsonObject, "$.store.bicycle.*"));
            System.out.println("bicycle的color和price属性值" + JSONPath.eval(jsonObject, "$.store.bicycle['color','price']"));
        }
    

    Js获取Json每个节点的JsonPath

    准备json测试数据

    var root = {
            name: '测试节点',
            doms: {
                name: "dom测试",
                children: [
                    {
                        name: '茶馆',
                        val: 'demo',
                        child: [
                            {"name": "李四", "cal": "ceshi"}, {"name": "王五", "cal": "ceshi"}
                        ]
                    },
                    {
                        name: '红与黑',
                        val: 'demo',
                        child: [
                            {"name": "张三", "cal": "ceshi"}, {"name": "张三", "cal": "ceshi"}
                        ]
                    }
                ]
            },
            children: [
                {
                    name: '学习',
                    children: []
                },
                {
                    name: '电影',
                    children: [
                        {
                            name: '喜剧电影'
                        },
                        {
                            name: '动作电影'
                        }
                    ]
                }
            ]
        }
    

    遍历Json对象获取每个节点的深度与JsonPath

         function traverseTree(node, flat) {
            var stack = [], res = [];
            if (!node) return;
            stack.push({"dom": node, "dep": 0, "path": "$", "name": "根节点"});
            var tmpNode;
            while (stack.length > 0) {
                tmpNode = stack.pop();
                res.push({
                    "name": tmpNode.name,
                    "pid": tmpNode.pid,
                    "path": tmpNode.path,
                    "dep": tmpNode.dep
                });
                traverseNode2(tmpNode, tmpNode.dep);
            }
    
            // 遍历单个节点
            function traverseNode2(node, dep) {
                var doc = node.dom;
                if (Object.prototype.toString.call(doc) === '[object Object]') {
                    for (var val in doc) {
                        var cpath = (node.path + "." + val);
                        stack.push({
                            "dom": doc[val],
                            "dep": (dep + 1),
                            "path": cpath,
                            "pid": node.path,
                            "name": val
                        });
                    }
                }
                if (Object.prototype.toString.call(doc) === '[object Array]') {
                    for (let i = 0; i < doc.length; i++) {
                        stack.push({
                            "dom": doc[i],
                            "dep": (dep + 1),
                            "path": (node.path + "[" + i + "]"),
                            "pid": node.path,
                            "name": node.name + "[" + i + "]"
                        });
                    }
                }
            }
    
            // 树形结构转换
            function flat2tree(jsonData) {
                var result = [], temp = {}, i = 0, j = 0, len = jsonData.length;
                for (; i < len; i++)
                    temp[jsonData[i]['path']] = jsonData[i]
                for (; j < len; j++) {
                    var cel = jsonData[j]
                    var tcel = temp[cel['pid']]
                    if (tcel) {
                        if (!tcel['children']) {
                            tcel['children'] = [];
                        }
                        tcel['children'].push(cel)
                    } else {
                        result.push(cel);
                    }
                }
                return result;
            }
    
            return flat ? flat2tree(res) : res;
        }
    

    测试输出

    console.log("res-tree:
    " + JSON.stringify(traverseTree(root, false)));
    res-tree:
    [
        {
            "name":"根节点",
            "path":"$",
            "dep":0
        },
        {
            "name":"children",
            "pid":"$",
            "path":"$.children",
            "dep":1
        },
        {
            "name":"children[1]",
            "pid":"$.children",
            "path":"$.children[1]",
            "dep":2
        },
        {
            "name":"children",
            "pid":"$.children[1]",
            "path":"$.children[1].children",
            "dep":3
        },
        {
            "name":"children[1]",
            "pid":"$.children[1].children",
            "path":"$.children[1].children[1]",
            "dep":4
        },
        {
            "name":"name",
            "pid":"$.children[1].children[1]",
            "path":"$.children[1].children[1].name",
            "dep":5
        },
        {
            "name":"children[0]",
            "pid":"$.children[1].children",
            "path":"$.children[1].children[0]",
            "dep":4
        },
        {
            "name":"name",
            "pid":"$.children[1].children[0]",
            "path":"$.children[1].children[0].name",
            "dep":5
        },
        {
            "name":"name",
            "pid":"$.children[1]",
            "path":"$.children[1].name",
            "dep":3
        },
        {
            "name":"children[0]",
            "pid":"$.children",
            "path":"$.children[0]",
            "dep":2
        },
        {
            "name":"children",
            "pid":"$.children[0]",
            "path":"$.children[0].children",
            "dep":3
        },
        {
            "name":"name",
            "pid":"$.children[0]",
            "path":"$.children[0].name",
            "dep":3
        },
        {
            "name":"doms",
            "pid":"$",
            "path":"$.doms",
            "dep":1
        },
        {
            "name":"children",
            "pid":"$.doms",
            "path":"$.doms.children",
            "dep":2
        },
        {
            "name":"children[1]",
            "pid":"$.doms.children",
            "path":"$.doms.children[1]",
            "dep":3
        },
        {
            "name":"child",
            "pid":"$.doms.children[1]",
            "path":"$.doms.children[1].child",
            "dep":4
        },
        {
            "name":"child[1]",
            "pid":"$.doms.children[1].child",
            "path":"$.doms.children[1].child[1]",
            "dep":5
        },
        {
            "name":"cal",
            "pid":"$.doms.children[1].child[1]",
            "path":"$.doms.children[1].child[1].cal",
            "dep":6
        },
        {
            "name":"name",
            "pid":"$.doms.children[1].child[1]",
            "path":"$.doms.children[1].child[1].name",
            "dep":6
        },
        {
            "name":"child[0]",
            "pid":"$.doms.children[1].child",
            "path":"$.doms.children[1].child[0]",
            "dep":5
        },
        {
            "name":"cal",
            "pid":"$.doms.children[1].child[0]",
            "path":"$.doms.children[1].child[0].cal",
            "dep":6
        },
        {
            "name":"name",
            "pid":"$.doms.children[1].child[0]",
            "path":"$.doms.children[1].child[0].name",
            "dep":6
        },
        {
            "name":"val",
            "pid":"$.doms.children[1]",
            "path":"$.doms.children[1].val",
            "dep":4
        },
        {
            "name":"name",
            "pid":"$.doms.children[1]",
            "path":"$.doms.children[1].name",
            "dep":4
        },
        {
            "name":"children[0]",
            "pid":"$.doms.children",
            "path":"$.doms.children[0]",
            "dep":3
        },
        {
            "name":"child",
            "pid":"$.doms.children[0]",
            "path":"$.doms.children[0].child",
            "dep":4
        },
        {
            "name":"child[1]",
            "pid":"$.doms.children[0].child",
            "path":"$.doms.children[0].child[1]",
            "dep":5
        },
        {
            "name":"cal",
            "pid":"$.doms.children[0].child[1]",
            "path":"$.doms.children[0].child[1].cal",
            "dep":6
        },
        {
            "name":"name",
            "pid":"$.doms.children[0].child[1]",
            "path":"$.doms.children[0].child[1].name",
            "dep":6
        },
        {
            "name":"child[0]",
            "pid":"$.doms.children[0].child",
            "path":"$.doms.children[0].child[0]",
            "dep":5
        },
        {
            "name":"cal",
            "pid":"$.doms.children[0].child[0]",
            "path":"$.doms.children[0].child[0].cal",
            "dep":6
        },
        {
            "name":"name",
            "pid":"$.doms.children[0].child[0]",
            "path":"$.doms.children[0].child[0].name",
            "dep":6
        },
        {
            "name":"val",
            "pid":"$.doms.children[0]",
            "path":"$.doms.children[0].val",
            "dep":4
        },
        {
            "name":"name",
            "pid":"$.doms.children[0]",
            "path":"$.doms.children[0].name",
            "dep":4
        },
        {
            "name":"name",
            "pid":"$.doms",
            "path":"$.doms.name",
            "dep":2
        },
        {
            "name":"name",
            "pid":"$",
            "path":"$.name",
            "dep":1
        }
    ]
    

    将输出结果转换成树形结构

    console.log("res-tree:
    " + JSON.stringify(traverseTree(root, true)));
    res-tree:
    [
        {
            "name":"根节点",
            "path":"$",
            "dep":0,
            "children":[
                {
                    "name":"children",
                    "pid":"$",
                    "path":"$.children",
                    "dep":1,
                    "children":[
                        {
                            "name":"children[1]",
                            "pid":"$.children",
                            "path":"$.children[1]",
                            "dep":2,
                            "children":[
                                {
                                    "name":"children",
                                    "pid":"$.children[1]",
                                    "path":"$.children[1].children",
                                    "dep":3,
                                    "children":[
                                        {
                                            "name":"children[1]",
                                            "pid":"$.children[1].children",
                                            "path":"$.children[1].children[1]",
                                            "dep":4,
                                            "children":[
                                                {
                                                    "name":"name",
                                                    "pid":"$.children[1].children[1]",
                                                    "path":"$.children[1].children[1].name",
                                                    "dep":5
                                                }
                                            ]
                                        },
                                        {
                                            "name":"children[0]",
                                            "pid":"$.children[1].children",
                                            "path":"$.children[1].children[0]",
                                            "dep":4,
                                            "children":[
                                                {
                                                    "name":"name",
                                                    "pid":"$.children[1].children[0]",
                                                    "path":"$.children[1].children[0].name",
                                                    "dep":5
                                                }
                                            ]
                                        }
                                    ]
                                },
                                {
                                    "name":"name",
                                    "pid":"$.children[1]",
                                    "path":"$.children[1].name",
                                    "dep":3
                                }
                            ]
                        },
                        {
                            "name":"children[0]",
                            "pid":"$.children",
                            "path":"$.children[0]",
                            "dep":2,
                            "children":[
                                {
                                    "name":"children",
                                    "pid":"$.children[0]",
                                    "path":"$.children[0].children",
                                    "dep":3
                                },
                                {
                                    "name":"name",
                                    "pid":"$.children[0]",
                                    "path":"$.children[0].name",
                                    "dep":3
                                }
                            ]
                        }
                    ]
                },
                {
                    "name":"doms",
                    "pid":"$",
                    "path":"$.doms",
                    "dep":1,
                    "children":[
                        {
                            "name":"children",
                            "pid":"$.doms",
                            "path":"$.doms.children",
                            "dep":2,
                            "children":[
                                {
                                    "name":"children[1]",
                                    "pid":"$.doms.children",
                                    "path":"$.doms.children[1]",
                                    "dep":3,
                                    "children":[
                                        {
                                            "name":"child",
                                            "pid":"$.doms.children[1]",
                                            "path":"$.doms.children[1].child",
                                            "dep":4,
                                            "children":[
                                                {
                                                    "name":"child[1]",
                                                    "pid":"$.doms.children[1].child",
                                                    "path":"$.doms.children[1].child[1]",
                                                    "dep":5,
                                                    "children":[
                                                        {
                                                            "name":"cal",
                                                            "pid":"$.doms.children[1].child[1]",
                                                            "path":"$.doms.children[1].child[1].cal",
                                                            "dep":6
                                                        },
                                                        {
                                                            "name":"name",
                                                            "pid":"$.doms.children[1].child[1]",
                                                            "path":"$.doms.children[1].child[1].name",
                                                            "dep":6
                                                        }
                                                    ]
                                                },
                                                {
                                                    "name":"child[0]",
                                                    "pid":"$.doms.children[1].child",
                                                    "path":"$.doms.children[1].child[0]",
                                                    "dep":5,
                                                    "children":[
                                                        {
                                                            "name":"cal",
                                                            "pid":"$.doms.children[1].child[0]",
                                                            "path":"$.doms.children[1].child[0].cal",
                                                            "dep":6
                                                        },
                                                        {
                                                            "name":"name",
                                                            "pid":"$.doms.children[1].child[0]",
                                                            "path":"$.doms.children[1].child[0].name",
                                                            "dep":6
                                                        }
                                                    ]
                                                }
                                            ]
                                        },
                                        {
                                            "name":"val",
                                            "pid":"$.doms.children[1]",
                                            "path":"$.doms.children[1].val",
                                            "dep":4
                                        },
                                        {
                                            "name":"name",
                                            "pid":"$.doms.children[1]",
                                            "path":"$.doms.children[1].name",
                                            "dep":4
                                        }
                                    ]
                                },
                                {
                                    "name":"children[0]",
                                    "pid":"$.doms.children",
                                    "path":"$.doms.children[0]",
                                    "dep":3,
                                    "children":[
                                        {
                                            "name":"child",
                                            "pid":"$.doms.children[0]",
                                            "path":"$.doms.children[0].child",
                                            "dep":4,
                                            "children":[
                                                {
                                                    "name":"child[1]",
                                                    "pid":"$.doms.children[0].child",
                                                    "path":"$.doms.children[0].child[1]",
                                                    "dep":5,
                                                    "children":[
                                                        {
                                                            "name":"cal",
                                                            "pid":"$.doms.children[0].child[1]",
                                                            "path":"$.doms.children[0].child[1].cal",
                                                            "dep":6
                                                        },
                                                        {
                                                            "name":"name",
                                                            "pid":"$.doms.children[0].child[1]",
                                                            "path":"$.doms.children[0].child[1].name",
                                                            "dep":6
                                                        }
                                                    ]
                                                },
                                                {
                                                    "name":"child[0]",
                                                    "pid":"$.doms.children[0].child",
                                                    "path":"$.doms.children[0].child[0]",
                                                    "dep":5,
                                                    "children":[
                                                        {
                                                            "name":"cal",
                                                            "pid":"$.doms.children[0].child[0]",
                                                            "path":"$.doms.children[0].child[0].cal",
                                                            "dep":6
                                                        },
                                                        {
                                                            "name":"name",
                                                            "pid":"$.doms.children[0].child[0]",
                                                            "path":"$.doms.children[0].child[0].name",
                                                            "dep":6
                                                        }
                                                    ]
                                                }
                                            ]
                                        },
                                        {
                                            "name":"val",
                                            "pid":"$.doms.children[0]",
                                            "path":"$.doms.children[0].val",
                                            "dep":4
                                        },
                                        {
                                            "name":"name",
                                            "pid":"$.doms.children[0]",
                                            "path":"$.doms.children[0].name",
                                            "dep":4
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            "name":"name",
                            "pid":"$.doms",
                            "path":"$.doms.name",
                            "dep":2
                        }
                    ]
                },
                {
                    "name":"name",
                    "pid":"$",
                    "path":"$.name",
                    "dep":1
                }
            ]
        }
    ]
    

    原文出处http://www.yund.tech/zdetail.html?type=1&id=c2b21696839eccdef2e9b085b9e064f6
    作者: jstarseven

  • 相关阅读:
    resin
    tomcat
    vba打开输入文件
    获取文件夹下所有文件2
    获取文件夹下所有文件
    修改Execl中sheet名的指定字符串为指定字符串
    SpringMVC入门到精通(一)
    Java JDBC
    Java反射
    Java日期格式化
  • 原文地址:https://www.cnblogs.com/jstarseven/p/12556791.html
Copyright © 2011-2022 走看看