Python_json数据检索与定位之jsonPath类库
json数据检索与定位之jsonPath类库
by:授客 QQ:1033553122
实践环境
win7 64
Python 3.4.0
jsonpath_ng-1.4.3-py2.py3-none-any.whl
下载地址:
https://pypi.org/project/jsonpath-ng/#files
https://pan.baidu.com/s/1AdbGqz1brNYBOqmIbWaAYg
使用详解
官方实例
>>> from jsonpath_ng import jsonpath, parse
>>> jsonpath_expr = parse('foo[*].baz')
# 提取值
>>> [match.value for match in jsonpath_expr.find({'foo':[{'baz':1}, {'baz':2}]})]
[1, 2]
# 获取匹配值对应的路径
>>> [str(match.full_path) for match in jsonpath_expr.find({'foo': [{'baz': 1}, {'baz': 2}]})]
['foo.[0].baz', 'foo.[1].baz']
# 自动提供id
>>> [match.value for match in parse('foo[*].id').find({'foo': [{'id': 'bizzle'}, {'baz': 3}]})]
['bizzle']
>>> jsonpath.auto_id_field = 'id'
>>> [match.value for match in parse('foo[*].id').find({'foo': [{'id': 'bizzle'}, {'baz': 3}]})]
['foo.bizzle', 'foo.[1]']
# 扩展功能之一 命名操作符 `parent`
>>> [match.value for match in parse('a.*.b.`parent`.c').find({'a': {'x': {'b': 1, 'c': 'number one'}, 'y': {'b': 2, 'c': 'number two'}}})]
['number one', 'number two']
>>> ['number two', 'number one']
使用扩展的解析器
好处是有更强大的扩展功能
>>> from jsonpath_ng.ext import parse
>>> jsonpath_expr = parse('foo[*].baz')
jsonpath 语法
基础语法(Atomic expressions)
$ 根对象
`this` 当前对象
`foo` More generally, this syntax allows "named operators" to extend JSONPath is arbitrary ways
field 指定具体的字段
[ field ] 同field
[ idx ] 数组访问 Array access, described below (this is always unambiguous with field access)
例子
获取根对象
>>> parse('$').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]})
[DatumInContext(value={'key2': {'id': 2}, 'key3': [{'id': 3}, {'name': 'shouke'}], 'key1': {'id': 1}}, path=Root(), context=None)]
>>> [match.value for match in parse('$').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]})]
[{'key2': {'id': 2}, 'key3': [{'id': 3}, {'name': 'shouke'}], 'key1': {'id': 1}}]
获取一级键对应的值
>>> [match.value for match in parse('key1').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]})]
[{'id': 1}]
>>> [match.value for match in parse('[key1]').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]})]
[{'id': 1}]
# 注意:单独使用 filed、 [filed] 语法,field仅支持字典的一级键
[{'key2': {'id': 2}, 'key3': [{'id': 3}, {'name': 'shouke'}], 'key1': {'id': 1}}]
>>> [match.value for match in parse('id').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]})]
[]
# 注意:单独使用 filed、 [filed] 语法,根对象必须是字典,不能是数组
>>> [match.value for match in parse('[key1]').find([{'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]}])]
[]
数组访问
>>> [match.value for match in parse('[0]').find([{'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]}])]
[{'key2': {'id': 2}, 'key3': [{'id': 3}, {'name': 'shouke'}], 'key1': {'id': 1}}]
jsonpath操作符
jsonpath1 . jsonpath2 匹配jsonpath2,并且父节点匹配jsonpath1的所有节点(All nodes matched by jsonpath2 starting at any node matching jsonpath1) 注意:仅针对字典可用
注:有无空格不影响,比如jsonpath1.jsonpath2 下同
jsonpath [ whatever ] 如果是字典,同jsonpath.whatever,如果是数组,则表示按索引访问数组
jsonpath1 .. jsonpath2 匹配jsonpath2,并且由匹配jsonpath1的父节点派生的所有节点
jsonpath1 where jsonpath2 匹配jsonpath1并且携带一个匹配jsonpath2直接子节点(非派生子节点)的所有节点(Any nodes matching jsonpath1 with a child matching jsonpath2)
jsonpath1 | jsonpath2 匹配jsonpath1,或者jsonpath2的所有节点的集合(注:有时候结果似乎和描述不符,具体见例子
例子
jsonpath1 . jsonpath2
>>> [match.value for match in parse('key1.id').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]})]
[1]
jsonpath [ whatever ]
>>> [match.value for match in parse('key1[id]').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]})]
[1]
>>> [match.value for match in parse('key3[0]').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}]})]
[{'id': 3}]
jsonpath1 .. jsonpath2
>>> [match.value for match in parse('key3..id').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':{'key4':{'key5':{'id':3, 'name':'shouke'}}}})]
[3]
>>> [match.value for match in parse('key3..id').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'}]})]
[3, 4]
jsonpath1 where jsonpath2
>>> [match.value for match in parse('key2 where id').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'
[{'id': 2}]
注意:匹配jsonpath2的必须是直接子节点
>>> [match.value for match in parse('key3 where id').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'
[]
>>> [match.value for match in parse('key3 where id').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':{'key4':{'key5':{'id':3, 'name':'shouke'}}}})]
[]
jsonpath1 | jsonpath2
>>> [match.value for match in parse('key1 | key3 ').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':{'key4':{'key5':{'id':3, 'name':'shouke'}}}})]
[{'id': 1}, {'key4': {'key5': {'name': 'shouke', 'id': 3}}}]
>>> [match.value for match in parse('key1 | key3.key4 ').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':{'key4':{'key5':{'id':3, 'name':'shouke'}}}})]
[{'key5': {'name': 'shouke', 'id': 3}}]
字段说明(field)
fieldname 来自当前对象的字段名称
"fieldname" 同上,允许fieldname中包含指定字符
'fieldname' 同上
* 任意字段名称
field , field 指定多个字段
例子
*
>>> [match.value for match in parse('key1.*').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':{'key4':{'key5':{'id':3, 'name':'shouke'}}}})]
[1]
注意:如果是jsonpath1.* 返回的是最后层级的值
>>> [match.value for match in parse('key3.*').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':{'key4':{'key5':{'id':3, 'name':'shouke'}}}})]
[{'key5': {'name': 'shouke', 'id': 3}}]
>>> [match.value for match in parse('key3.*').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'}]})]
[]
>>> [match.value for match in parse('key1, key2, key3').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'kesh
[{'id': 1}, {'id': 2}, [{'id': 3}, {'name': 'shouke'}, {'name': 'keshou', 'id': 4}]]
>>> [match.value for match in parse('*.*[*]').find({'root':{'key':[{'id':'tizza'}, {'name':'hizza'}]}})]
[{'id': 'tizza'}, {'name': 'hizza'}]
field , field 指定多个字段
>>> [match.value for match in parse('key1, key2, key3').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'}]
[{'id': 1}, {'id': 2}, [{'id': 3}, {'name': 'shouke'}, {'name': 'keshou', 'id': 4}]]
数组索引说明(idx)
[n] 数组索引
[start?:end?] 含义同python的数组切片,注意:数组索引不包含end,可以不指定start, end,或者两者之一
[*] 任意索引,表示返回整个数组元素,等同于[:]
例子
[*]
[match.value for match in parse('key3[*]').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'}]})]
[{'id': 3}, {'name': 'shouke'}, {'name': 'keshou', 'id': 4}]
[start?:end?]
>>> [match.value for match in parse('key3[0:1]').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'}]})]
[{'id': 3}]
>>> [match.value for match in parse('key3[0:]').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'}]})]
[{'id': 3}, {'name': 'shouke'}, {'name': 'keshou', 'id': 4}]
>>> [match.value for match in parse('key3[:1]').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'}]})]
[{'id': 3}]
>>> [match.value for match in parse('key3[:]').find({'key1':{'id': 1}, 'key2':{'id': 2}, 'key3':[{'id':3}, {'name':'shouke'}, {'id':4, 'name':'keshou'}]})]
[{'id': 3}, {'name': 'shouke'}, {'name': 'keshou', 'id': 4}]
>>>
更多功能参考官方文档
参考链接
https://pypi.org/project/jsonpath-ng/#files
Python_json数据检索与定位之jsonPath类库的更多相关文章
- 【转】JsonPath教程
https://blog.csdn.net/koflance/article/details/63262484 1. 介绍 类似于XPath在xml文档中的定位,JsonPath表达式通常是用来路径检 ...
- JsonPath教程
1. 介绍 类似于XPath在xml文档中的定位,JsonPath表达式通常是用来路径检索或设置Json的.其表达式可以接受“dot–notation”和“bracket–notation”格式,例如 ...
- Halcon相关
1.Halcon的自我描述 Program Logic Ø Each program consists of a sequence of HALCON operators Ø The progra ...
- Prism 4 文档 ---第3章 管理组件间的依赖关系
基于Prism类库的应用程序可能是由多个松耦合的类型和服务组成的复杂应用程序,他们需要根据用户的动作发出内容和接收通知进行互动,由于他们是松耦合的,他们需要一种方式来互动和交流来传递业务功能的需求. ...
- ETL-Kettle学习笔记(入门,简介,简单操作)
KETTLE Kettle:简介 ETL:简介 ETL(Extract-Transform-Load的缩写,即数据抽取.转换.装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换, ...
- Python_实现json数据的jsonPath(精简版)定位及增删改操作
基于python实现json数据的jsonPath(精简版)定位及增删改操作 by:授客 QQ:1033553122 实践环境 win7 64 Python 3.4.0 代码 #-*- encod ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(2)
上半部分内容链接 : https://www.cnblogs.com/lowmanisbusy/p/9069330.html 四.json和jsonpath的使用 JSON(JavaScript Ob ...
- Json与jsonpath再认识与初识
一.json格式的数据 1.认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于 ...
- 使用nuget打包类库并发布
前言 NuGet 是免费.开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库.今天的目的就是记录一下如何打包一个类库,并发布到官网.在开始之前需要在www.nuget. ...
随机推荐
- java中Base64的加密工具封装
Base64加密作为最简单普遍的加密方式(其实只能称为编码方式),应用场景众多比如秘钥,安全证书,也应用在其他的加密方式中或与其他加密方式进行嵌套使用 可以通过引用sun.misc来使用,也可以自己手 ...
- Source Qualifter组件中sqlquery过长导致截取
问题:Source Qualifter组件中sqlquery过长导致截取原因:Source Qualifter组件中sqlquery可以接受的最长字符数是32767个字符,超过这个数字会导致截取解决方 ...
- redis安装以及安全配置
redis安装以及安全配置 1. 安装 sudo apt-get install redis-server 使用which查询redis执行体安装路径: which redis-server #/us ...
- 微信小程序自定义navigationBar标题栏
小程序默认使用的navigationBar只能设置颜色.文字,左侧返回按钮也是不可改变的,若要实现下方效果有解决方案,但是也有一定的问题. 1.更改app.json "window" ...
- Servlet & JSP系列文章总结
前言 谢谢大家的捧场,真心感谢我的阅读者. @all 下一期,重点在 数据结构和算法 ,希望给大家带来开心.已经出了几篇,大家爱读就是我的开心. Servlet & JSP系列总结 博客, ...
- java为什么用咖啡?
2000年度的JavaOne国际会议大厅热闹非凡,一阵阵浓郁的咖啡味儿香气扑鼻.从世界各地汇集到旧金山参加会议的Java精英们兴奋异常,排着长队,等待得到一杯由Java语言控制的咖啡机煮制的免费咖啡. ...
- Spring Boot (三)模板引擎FreeMarker集成
一.FreeMaker介绍 FreeMarker是一款免费的Java模板引擎,是一种基于模板和数据生成文本(HMLT.电子邮件.配置文件.源代码等)的工具,它不是面向最终用户的,而是一款程序员使用的组 ...
- 分布式系统监视zabbix讲解四之可视化--技术流ken
图形 概述 随着大量的监控数据被采集到Zabbix中,如果用户可以以可视化的表现形式来查看发生了什么事情,那么和仅仅只有数字的表现形式比起来则更加轻松. 以下是进行图形设置的地方.图形可以一目了然地掌 ...
- [转]docker 部署 mysql + phpmyadmin 3种方法
本文转自:https://blog.csdn.net/Gekkoou/article/details/80897309 方法1: link # 创建容器 test-mysql (千万别用 mysql: ...
- WebBrowser引用IE版本问题,更改使用高版本IE
做了一个Winform的项目.项目里使用了WebBrowser控件.以前一直都以为WebBrowser是直接调用的系统自带的IE,IE是呈现出什么样的页面WebBrowser就呈现出什么样的页面.其实 ...