python的jsonpath实现
JSONPyth的Python项目详细描述
jsonpyth
python的另一个JSONPath实现。
支持:
- 根
$
和当前@
节点 - 子运算符
.
或[
…]
- 属性访问(包括单引号
'
和双引号"
分隔 姓名) - 递归下降
..
- 通配符
*
- 名称/索引集
[a,b,c]
- 数组切片
[start:end:step]
(包括负值) - Python脚本表达式
(
)
和筛选表达式?(
)
使用$
和@
要求
需要Python3.5+并依赖于PyParsing包。
安装
JSONPyth可以直接从Github克隆并与其一起安装
依赖项使用pip
:
$ pip install git+https://github.com/Frimkron/JSONPyth#egg=JSONPyth
或者可以手动下载源,然后通过运行
setup.py
脚本:
$ python setup.py install
用法
首先将一些json数据解析为python结构,例如使用json 标准库中的包:
importjson# parse some JSON from a stringdata=json.loads(""" { "cakes": [ { "name": "red velvet", "rating": 4.5 }, { "name": "battenberg" }, { "name": "jaffa cakes", "rating": 5.0 } ], "biscuits": [ { "name": "bourbon", "rating": 5.0 }, { "name": "custard cream", "rating": 3.5 }, { "name": "pink wafer", "rating": null }, { "name": "nice" } ] }""")
然后可以使用JSONPath表达式查询数据:
fromjsonpythimportjsonpathresult=jsonpath(data,'$.biscuits[*].rating')forrinresult:print(r)
上面的示例将打印以下输出:
5
3.5
None
返回路径
默认情况下,返回每个结果的值。获得正规化路径
而是将每个结果的result_type
参数设置为RESULT_TYPE_PATH
,
或者RESULT_TYPE_BOTH
可用于返回包含两个值的2元组
以及路径:
fromjsonpythimportjsonpath,RESULT_TYPE_BOTHresult=jsonpath(data,'$.biscuits[*].rating',result_type=RESULT_TYPE_BOTH):forrinresult:print(r)
输出:
(5, '$["biscuits"][0]["rating"]')
(3.5, '$["biscuits"][1]["rating"]')
(None, '$["biscuits"][2]["rating"]')
Python表达式
jsonpath脚本表达式(括在括号中)可用于 对python语句求值以将字典键作为字符串或列表提供 索引为数字。其他类型的返回值将被忽略
由于括号用于分隔表达式,因此
脚本本身必须用反斜杠\
转义。
特殊符号@
(当前节点)和$
(根节点)将被替换
对于分别名为__current
和__root
的变量,使用简单的文本
在计算语句之前替换。在中使用文本@
或$
脚本必须用two反斜杠\\
转义。注意字符串
literal将\\
识别为转义反斜杠;在这种情况下,每个
反斜杠必须进一步转义("\\\\@"
),否则将使用原始文字
(r"\\@"
)
示例脚本表达式:
result=jsonpath(data,r'$.cakes[(len\(@\)-1)].name')forrinresult:print(r)
输出:
jaffa cakes
注意jsonpyth调用eval
来计算python脚本,因此不安全
用于来自不受信任源的JSONPath表达式
python过滤器
与表达式类似,过滤器(?(...)
)使用Python语句来测试
是否包含节点。结果值的真实性将是
使用bool
测试,如果False
节点将被忽略
示例:
result=jsonpath(data,r'$[*][?(@["name"].startswith\("b"\))]')forrinresult:print(r)
输出:
{"name": "battenberg"}
{"name": "bourbon", "rating": 5}
学分和执照
JSONPyth由马克·弗里姆斯顿撰写,并获得麻省理工学院的许可
执照。此许可证的全文可以在LICENCE.txt
文件中找到。