您现在的位置是:网站首页 > 博客日记 >

python之jsonpath库

作者:YXN-python 阅读量:102 发布日期:2022-10-01

JSONPath 语法元素与其 XPath 对应元素的完整概述和并排比较

Xpath JsonPath 描述
/ $ 根节点
. @ 现行节点
/ .or[] 取子节点
.. n/a 就是不管位置,选择所有符合条件的条件
* * 匹配所有元素节点
[] [] 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)
| [,] 支持迭代器中做多选
[] ?() 支持过滤操作
n/a () 支持表达式计算
() n/a 分组, Json Path不支持

此外,下标运算符在 Xpath 和 JSONPath 中的工作方式也存在显着差异。

  • XPath 表达式中的方括号始终在 *节点集* 由上一个路径片段产生。索引始终以 1 开头。
  • 使用 JSONPath 方括号操作在 *对象* 或 *数组* 由上一个路径片段寻址。索引始终以 0 开头。

案例:

{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
XPath JSONPath 结果
/store/book/author $.store.book[*].author 商店中所有书籍的作者
//author $..author 所有作者
/store/* $.store.* 商店里的所有东西,都是一些书和一辆红色的自行车
/store//price $.store..price 商店里所有东西的价格
//book[3] $..book[2] 第三本书
//book[last()] $..book[(@.length-1)] 或 $..book[-1:] 最后一本书按顺序排列
//book[position()<3] $..book[0,1]
$..book[:2]
前两本书
//book[isbn] $..book[?(@.isbn)] 过滤所有带有 ISBN 编号的图书
//book[price<10] $..book[?(@.price<10)] 过滤所有便宜于10的书籍
//* $..* XML 文档中的所有元素。JSON 结构的所有成员

问题

  • 目前 JSONPath 表达式中只允许使用单引号。
  • JSONPath 位置内的脚本表达式当前未由 `jsonPath`.只有全球 `$` 和本地 `@` 符号通过简单的正则表达式进行扩展。
  • 替代 `jsonPath` 返回 `false` 在以下情况下 *无匹配* 将来可能会返回一个空数组。

举例:

url = ''
obj = json.loads(requests.get(url).text)
singer = jsonpath.jsonpath(obj, '$.result.songs[*].artists[0].name')

YXN-python

2022-10-01