这是一个强大且显著扩展的JSONPath实现,适用于Python,具有清晰的AST用于元编程。
项目描述
https://github.com/kennknowles/python-jsonpath-rw
此库提供了一个强大且显著扩展的JSONPath实现,适用于Python。它与Python 2.6、2.7、3.2和3.3进行测试。(在travis-ci上,使用pypy运行测试时出现段错误;我认为问题不在于此库。)
与其他JSONPath实现相比,此库的不同之处在于它是一个完整的 语言 实现,这意味着JSONPath表达式是第一类对象,易于分析、转换、解析、打印和扩展。(您还可以执行它们:)
快速开始
要安装,请使用pip
$ pip install jsonpath-rw
然后
$ python
>>> from jsonpath_rw import jsonpath, parse
# A robust parser, not just a regex. (Makes powerful extensions possible; see below)
>>> jsonpath_expr = parse('foo[*].baz')
# Extracting values is easy
>>> [match.value for match in jsonpath_expr.find({'foo': [{'baz': 1}, {'baz': 2}]})]
[1, 2]
# Matches remember where they came from
>>> [str(match.full_path) for match in jsonpath_expr.find({'foo': [{'baz': 1}, {'baz': 2}]})]
['foo.[0].baz', 'foo.[1].baz']
# And this can be useful for automatically providing ids for bits of data that do not have them (currently a global switch)
>>> jsonpath.auto_id_field = 'id'
>>> [match.value for match in parse('foo[*].id').find({'foo': [{'id': 'bizzle'}, {'baz': 3}]})]
['foo.bizzle', 'foo.[1]']
# A handy extension: named operators like `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 two', 'number one']
# You can also build expressions directly quite easily
>>> from jsonpath_rw.jsonpath import Fields
>>> from jsonpath_rw.jsonpath import Slice
>>> jsonpath_expr_direct = Fields('foo').child(Slice('*')).child(Fields('baz')) # This is equivalent
JSONPath语法
此库支持的JSONPath语法包括一些附加功能,并省略了一些有问题的功能(那些使其不可移植的功能)。特别是,一些新操作符,如 | 和 where,可用,并且括号用于分组,而不是将回调传递给Python,因为这些更改,语言不是简单关联的。此外,字段可以加引号,无论它们是否包含在方括号中。
原子表达式
语法 |
含义 |
---|---|
$ |
根对象 |
`this` |
“当前”对象。 |
`foo` |
更一般地说,此语法允许“命名运算符”以任意方式扩展JSONPath |
字段 |
指定的字段,以下将描述 |
[ field ] |
与 field 相同 |
[ idx ] |
数组访问,以下将描述(这始终与字段访问无歧义) |
JSONPath运算符
语法 |
含义 |
---|---|
jsonpath1 . jsonpath2 |
从任何匹配jsonpath1的节点开始,匹配jsonpath2的所有节点 |
jsonpath [ whatever ] |
等同于jsonpath.whatever |
jsonpath1 .. jsonpath2 |
匹配jsonpath2的所有节点,这些节点是从匹配jsonpath1的任何节点派生的 |
jsonpath1 where jsonpath2 |
任何匹配jsonpath1的节点,其子节点匹配jsonpath2 |
jsonpath1 | jsonpath2 |
匹配jsonpath1和jsonpath2的并集的任何节点 |
字段指定符(field)
语法 |
含义 |
---|---|
fieldname |
当前对象中的字段fieldname |
"fieldname" |
同上,允许字段名中有特殊字符 |
'fieldname' |
同上 |
* |
任何字段 |
field , field |
名为字段中的任何一个(您可以使用|构建等效的jsonpath) |
数组指定符(idx)
语法 |
含义 |
---|---|
[n] |
数组索引(可能是逗号分隔的列表) |
[start?:end?] |
数组切片(注意由于目前不需要,所以未实现步长) |
[*] |
任何数组索引 |
程序化JSONPath
如果您正在用Python编程,并且想要一种更健壮的方式来创建不依赖于解析器的JSONPath表达式,这非常简单,以下是一些示例
Root()
Slice(start=0, end=None, step=None)
Fields('foo', 'bar')
Index(42)
Child(Fields('foo'), Index(42))
Where(Slice(), Fields('subfield'))
Descendants(jsonpath, jsonpath)
扩展
路径数据:JsonPath.find的结果提供了详细的上下文和路径数据,因此可以轻松地遍历到父对象、打印数据的完整路径以及生成自动ID。
自动ID:如果您将jsonpath_rw.auto_id_field设置为一个非None的值,那么对于任何缺少该字段的条目,它将被JSONPath替换,为任何数据条目提供自动的唯一ID。这些ID将考虑任何现有的ID。
命名运算符:此库使用`this`而不是使用`@`来引用当前对象。通常,任何包含反引号的字符串都可以通过扩展库成为新的运算符。
更多探索
关于jsonpath实现有很多,难以一一讨论。有些是健壮的,有些是玩具项目但仍能正常工作,有些是练习。无疑会更多。这个是为发布和维护的代码制作的,特别是用于程序化访问抽象语法和扩展。但JSONPath在最简单的情况下并不复杂,所以您可能可以使用任何一个都成功。为什么不是这个呢?
据我所知,原始提案
JSONPath - XPath for JSON by Stefan Goessner。
关于PLY和docstrings的特殊说明
该库底层的主要解析工具包,PLY,不支持移除文档字符串。例如,PYTHONOPTIMIZE=2 和 python -OO 都会导致失败。
贡献者
本软件包由以下人员编写和维护:
以及这些贡献者提供的补丁帮助。
版权和许可证
版权所有 2013- Kenneth Knowles
根据Apache许可证版本2.0(“许可证”);除非适用法律要求或书面同意,否则不得使用此文件,除非符合许可证。您可以在以下位置获得许可证副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证中具体规定许可权限和限制的内容,请参阅许可证。
项目详情
jsonpath-rw-1.4.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 05c471281c45ae113f6103d1268ec7a4831a2e96aa80de45edc89b11fac4fbec |
|
MD5 | 3a807e05c2c12158fc6bb0a402fd5778 |
|
BLAKE2b-256 | 717c45001b1f19af8c4478489fbae4fc657b21c4c669d7a5a036a86882581d85 |