跳转到主要内容

这是一个强大且显著扩展的JSONPath实现,适用于Python,具有清晰的AST用于元编程。

项目描述

https://github.com/kennknowles/python-jsonpath-rw

Build Status Test coverage PyPi version PyPi downloads

此库提供了一个强大且显著扩展的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

匹配jsonpath1jsonpath2的并集的任何节点

字段指定符(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在最简单的情况下并不复杂,所以您可能可以使用任何一个都成功。为什么不是这个呢?

据我所知,原始提案

关于PLY和docstrings的特殊说明

该库底层的主要解析工具包,PLY,不支持移除文档字符串。例如,PYTHONOPTIMIZE=2python -OO 都会导致失败。

贡献者

本软件包由以下人员编写和维护:

以及这些贡献者提供的补丁帮助。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

jsonpath-rw-1.4.0.tar.gz (13.8 kB 查看哈希值)

上传时间 源代码

由以下机构支持