python的jsonpath实现

JSONPyth的Python项目详细描述


jsonpyth

Build Status

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文件中找到。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何下载多个。java中的PDF文件   linux Java打开文件,形成实际用户主页~/   java如何在时间线内维护TableView选择?   java Hibernate注释@Where vs@WhereJoinTable   Java读/写访问异常FileNotFoundException(访问被拒绝)   继承在Java中是否可以扩展最后一个类?   Android HttpClient使用java使应用程序崩溃。lang.OutOfMemoryError:pthread_create   java为什么即使我在proguardproject中添加了jar文件,也会出现这种错误。txt?   如果添加JButton,swing Java FocusListener和KeyListener将无法工作   java使用solrj检索json格式的SolrDocument   使用Microsoft Visual Studio代码进行Java编程   java NoClassDefFoundError:org/apache/log4j/Logger   哈希集中包含相等对象的java   java中的参数化构造函数是否需要有一个主体?   java类似于NetBeans不必要的代码检测器   Java实践问题   java Blackberry“[projectname].调试文件丢失”和“I/O错误:找不到程序”jar