首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Js解析Json数据获取元素JsonPath与深度

Js解析Json数据获取元素JsonPath与深度

原创
作者头像
大道七哥
修改于 2020-03-30 03:07:45
修改于 2020-03-30 03:07:45
14.3K00
代码可运行
举报
文章被收录于专栏:大道七哥大道七哥
运行总次数:0
代码可运行

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依赖#

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Copy<dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.6</version>
</dependency>

java简单的解析案例#

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Copypublic class JsonPath {
    public static void main(String[] args) {
        String jsonStr = "{\n" +
                "  \"store\": {\n" +
                "    \"book\": [\n" +
                "      {\n" +
                "        \"category\": \"reference\",\n" +
                "        \"author\": \"Nigel Rees\",\n" +
                "        \"title\": \"Sayings of the Century\",\n" +
                "        \"price\": 8.95\n" +
                "      },\n" +
                "      {\n" +
                "        \"category\": \"fiction\",\n" +
                "        \"author\": \"Evelyn Waugh\",\n" +
                "        \"title\": \"Sword of Honour\",\n" +
                "        \"price\": 12.99,\n" +
                "        \"isbn\": \"0-553-21311-3\"\n" +
                "      }\n" +
                "      {\n" +
                "        \"category\": \"fiction\",\n" +
                "        \"author\": \"Evelyn Waugh\",\n" +
                "        \"title\": \"Sword of Honour two\",\n" +
                "        \"price\": 12.99,\n" +
                "        \"isbn\": \"0-553-21311-3\"\n" +
                "      }\n" +
                "    ],\n" +
                "    \"bicycle\": {\n" +
                "      \"color\": \"red\",\n" +
                "      \"price\": 19.95\n" +
                "    }\n" +
                "  }\n" +
                "}";
        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测试数据#

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Copyvar 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#

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Copy     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;
    }

测试输出#

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Copyconsole.log("res-tree:\n" + 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
    }
]

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Copyconsole.log("res-tree:\n" + 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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用JSONPath解析json数据
之前学习爬虫的时候,如果是 HTML 的数据,通过 xpath 或是 css 选择器,就能很快的获取我们想要的数据,如果是 json 有没有类似 xpath 这种,能够直接根据条件定位数据,而不需要自行 json 解析在遍历获取。答案是有的,也就是 JSONPath。
愧怍
2022/12/27
2.9K0
使用JSONPath解析json数据
jsonPath-快速获取/设置json指定位置
在一些特殊场景中,可能 一串json有几个甚至上万个节点,那么要去获取里面某一个节点或者说设置某个json指定key的值,那就非常麻烦了,一般我们是通过递归来进行获取,获取后还需要再通过递归进行遍历设置值,所以相当来说非常麻烦。是否有已有现成的工具进行设置呢?
逍遥壮士
2022/06/15
2.2K0
jsonPath-快速获取/设置json指定位置
jsonpath 判断是否包含_JSONPath介绍
User user = new User(“itguang”, “123456”, “123@qq.com”);
全栈程序员站长
2022/09/09
1.6K0
JsonPath基本用法
本文主要介绍JsonPath的基本语法,并演示如何在Newtonsoft.Json中进行使用。
拓荒者IT
2019/09/24
3.2K0
Python爬虫数据抽取(一):解析库json及jsonpath pickle
Python爬虫数据抽取(一):解析库json及jsonpath pickle
Java架构师必看
2021/05/14
6770
Python爬虫数据抽取(一):解析库json及jsonpath pickle
JsonPath实践(一)
最近团队开发了一个平台,功能界面类似postman,用例都还是单接口的用例,就是可以绑定一个用户的登录状态和一些常量。验证功能主要分为两类:1、系统验证(包括请求异常、HTTP状态码、通用响应结构验证);2、功能验证(包括业务code、文本内容等)。都是通过字符串解析和正则匹配来完成的。
FunTester
2020/08/13
1.5K0
JsonPath使用和示例
虫无涯
2023/08/14
4240
JsonPath实践(二)
本期接一下如何使用JSonpath标记语法处理,json对象中的数组主要内容是提取数组中对象和对象集合。
FunTester
2020/08/19
5580
JsonPath实践(四)
本期继续将如何处理json数组,主要内容是通过正则过滤json数组中的数据,以及通过正则校验json节点值。
FunTester
2020/08/20
8430
JsonPath用法详解
JSONPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括Javascript、Python、PHP和Java。
全栈程序员站长
2022/09/06
1.2K0
JsonPath用法详解
JsonPath文档
本文翻译自官方文档,JsonPath表达式通常是用来路径检索或设置Json的。其表达式可以接受“dot–notation”和“bracket–notation”格式,例如.store.book[0].title、[‘store’][‘book’][0][‘title’]
全栈程序员站长
2022/07/02
3.4K0
JsonPath文档
JsonPath实践(五)
今天分享的内容是JSonpath过滤数据的API。这部分API分成两类:一类是运算符,例如:==、>、=~这些,一类是方法或者函数,例如:in、nin、anyof等等。
FunTester
2020/08/27
5050
JSONPath 学习笔记
JSONPath 是一种类似于 XPath 的查询语言,用于在 JSON 数据中定位和提取特定部分的数据。它提供了一种简洁而强大的方式来导航和检索 JSON 结构中的元素,使得我们可以轻松地从复杂的 JSON 数据中提取所需的信息。
授客
2024/12/14
2250
JSONPath 表达式
大家好,又见面了,我是你们的朋友全栈君。JSONPath 是参照,xpath表达式来解析xml文档的方式,json数据结构通常是匿名的并且不一定需要有根元素。JSONPaht 用一个抽象的名字$来表示最外层对象。
全栈程序员站长
2022/07/04
5260
使用jsonpath解析json
为了能像写XPath一样写json路径,Stefan Goessner开发了jsonpath(https://goessner.net/articles/JsonPath/)。
SeanCheney
2019/04/23
1.7K0
Python-数据解析-JSONPath
JSONPath 是一种信息抽取类库,是从 JSON 文档中抽取指定信息的工具。
小团子
2019/07/18
5290
Python-数据解析-JSONPath
JMeter之Json提取器详解
Json提取器属于JMeter的后置处理器, 所谓后置提取器就是请求结束后, 对响应结果进行变量提取, 提取变量是为了验证变量是否符合预期或者将变量值作为全局变量, 以供其他请求使用.
louiezhou001
2020/07/22
8.6K0
jsonpath :从入门到精通
在数据处理和交换领域,JSON已经成为了一种广泛使用的数据格式, 如何有效地查询和操作这些数据也变得越来越重要。在这种情况下,JSONPath 应运而生,成为了一种在JSON数据中定位和提取信息的强大工具。
公众号:码到三十五
2024/05/31
2K0
jsonpath :从入门到精通
JsonPath工具类单元测试
上期文章讲到JsonPath工具类封装,遗留了一个坑,就是关于工具类的单元测试,由于中午得空,所以使用单元测试框架Spock写了一点点单元测试用例,分享出来,供大家参考。
FunTester
2020/09/08
1.1K0
介绍一款python解析json格式的利器(接口测试平台开发必备)
我们在python解析复杂的json一文中呢,是自己去封装了一个简单的json处理的代码,但是有时候还是不能满足需求。那么我们今天去介绍一捆json解析的利器--jsonpath。
雷子
2022/05/21
9040
介绍一款python解析json格式的利器(接口测试平台开发必备)
相关推荐
使用JSONPath解析json数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档