一、简介

  • JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, PythonPHPJava

  • JsonPath 对于 JSON 来说,相当于 XPATH 对于 XML,参考文章:

    • JSON 数据解析(Json & JsonPath)

    • JSONPath-简单入门

    • goessner - JsonPath

  • Json 结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了 XPath 的用法(n/a 代表不支持):

    XPath JSONPath 描述
    / $ 根节点
    . @ 现行节点
    / . or [] 取子节点
    .. n/a 取父节点,JsonPath 未支持
    // .. 就是不管位置,选择所有符合条件的条件
    * * 匹配所有元素节点
    @ n/a 根据属性访问,Json 不支持,因为 Json 是个 Key-value 递归结构,不需要
    [] [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
    | [,] 支持迭代器中做多选
    [] ?() 支持过滤操作
    n/a () 支持表达式计算
    () n/a 分组,JsonPath 不支持

二、使用案例

  • 安装

    $ pip install jsonpath
    
  • 本地案例测试数据,从 goessner - JsonPath 中拷贝的

    { "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}}
    }
    
  • 本地案例

    # 导入 json
    import json
    # 导入 jsonpath
    import jsonpath# 1、json 读取本地文件
    obj = json.load(open('test.json', 'r', encoding='utf-8'))# 2、jsonpath 进行分析查找# 获取所有书籍的作者名称
    list = jsonpath.jsonpath(obj, '$.store.book[*].author') # ['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']
    list = jsonpath.jsonpath(obj, '$..author') # ['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']# 获取 store 下面的所有元素
    list = jsonpath.jsonpath(obj, '$.store.*') # [[{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}, ...], {'color': 'red', 'price': 19.95}]# 获取第 3 本书
    list = jsonpath.jsonpath(obj, '$..book[2]') # [{'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99}]# 获取最后一本书
    list = jsonpath.jsonpath(obj, '$..book[(@.length - 1)]') # [{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]# 获取前 2 本书
    list = jsonpath.jsonpath(obj, '$..book[0, 1]') # 错误写法,[0, 1]不能有空格,不然只会生效第一个值,后面的值不生效
    list = jsonpath.jsonpath(obj, '$..book[0,1]') # [{'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}]
    list = jsonpath.jsonpath(obj, '$..book[:2]') # 切片写法,结果一样# 条件过滤需要再 () 前面添加一个 ?
    # 过滤出包含 isbn 的书
    list = jsonpath.jsonpath(obj, '$..book[?(@.isbn)]') # [{'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}]# 查询哪本书超过 10 块钱
    list = jsonpath.jsonpath(obj, '$..book[?(@.price > 10)]') # [{'category': 'fiction', 'author': 'Evelyn Waugh', 'title': 'Sword of Honour', 'price': 12.99}, {'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]# 输出
    print(list)
    
  • 远程案例

    # 测试某站的城市地址接口# 使用 urllib
    import urllib.request
    # 使用 json
    import json
    import jsonpath# 获取地址
    url = 'https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1668502740745_108&jsoncallback=jsonp109&action=cityAction&n_s=new&event_submit_doGetAllRegion=true'# 请求头
    headers = {# 带冒号的请求头都需要注释掉,报错:ValueError: Invalid header name b':Authority'# ':authority': 'dianying.taobao.com',# ':method': 'GET',# ':path': '/cityAction.json?activityId&_ksTS=1668502740745_108&jsoncallback=jsonp109&action=cityAction&n_s=new&event_submit_doGetAllRegion=true',# ':scheme': 'https',# 'accept': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01',# 报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte# 'accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9','bx-v': '2.2.3','cookie': 't=1e424829769814085473c593565f4f5e; cookie2=17da1c30f22c22dd8d81dd3a871ab15b; v=0; _tb_token_=e817e63793373; cna=YQP5G0dsBVICAXToSX0EYCa1; xlly_s=1; isg=BPX1ozOY-se3Ah57r0dv0iYMBHevcqmEGFxmE3ca42y7ThVAP8MsVEZAmBL4DsE8; l=eBTcoCz7T1tElPbMBOfZnurza779LIRAguPzaNbMiOCP97CH57nFW6zmqRTMCnGVhsF9R3kzvXKpBeYBclYsjqj4axom4zHmn; tfstk=cJ1lBkVp-nisATNdcgO71aCmdIyOZYcej65fgrjQfnFphI1ViZkqQ2V7o3q_4v1..','referer': 'https://dianying.taobao.com/','sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"macOS"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-origin','user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36','x-requested-with': 'XMLHttpRequest'
    }# 请求对象
    request = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发起请求
    response = urllib.request.urlopen(request)# 响应数据转成字符串
    content = response.read().decode('utf-8')# 会发现拿回来的数据是一个 jsonp109({xx: xx}); 包裹的字符串,放到 https://www.json.cn/ 解析也失败
    # 解决办法:删除 'jsonp109(' 与后面的 ');' 即可
    # 代码切割
    content = content.split('(')[1].split(')')[0]# 字符串转 json
    obj = json.loads(content)# 将内容写入文件(使用 json.loads() 则不需要存储)
    with open('test.json', 'w', encoding='utf-8') as f:f.write(content)# 方式一:读取文件(需要存储,在读出来)
    obj = json.load(open('test.json', 'r', encoding='utf-8'))
    # 方式二:字符串转 json(不需要存储,直接使用)
    # obj = json.loads(content)# 导出所有 regionName 名称
    regionNames = jsonpath.jsonpath(obj, '$..regionName')# 输出
    print(regionNames)
    

Python JsonPath 详细使用相关推荐

  1. python详细安装步骤-Python的详细安装步骤

    这是一篇关于如何安装Python的详细教程,经过下面的解读,然后跟着以下步骤,你也可以在自己的电脑安装Python了! 一. Python简介: Python在Linux.windows.Mac os ...

  2. python详细安装步骤-Pycharm及python安装详细教程(图解)

    首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/ ),进入之后如下图,选择图中红色圈中区域进行下载. 2 ...

  3. 电脑安装python步骤-windows10系统安装python的详细步骤

    Python是一门受广大用户所喜爱欢迎的.使用广泛的语言.最近,就有一些升级win10正式版的用户反映自己想要在新系统中安装Python软件,但是又不知道该如何操作.接下来,小编就为大家分享win10 ...

  4. r语言和python-r语言和python的详细对比

    r语言和python的对比,两者各有千秋,究竟要学哪一个,可根据自己的实际需求来作出选择,当然,最好是两者都学. 01 开发目的 R语言 R是由统计学家开发的,它的出生就肩负着统计分析.绘图.数据挖掘 ...

  5. 安装python应该先安装pycharm还是python_Pycharm及python安装详细步骤及PyCharm配置整理(推荐)...

    首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址: https://www.python.org/downloads/),进入之后如下图,选择图中红色圈中区域进行下载. ...

  6. Python JSONPath示例

    什么是JSONPath? (What is JSONPath?) JSONPath is an expression language to parse JSON data. It's very si ...

  7. python详细安装教程-Pycharm及python安装详细教程(图解)

    首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/ ),进入之后如下图,选择图中红色圈中区域进行下载. 2 ...

  8. 机器学习常用的六种分类方法,Python代码详细都在这里!

    机器学习常用的六种分类方法,Python代码详细都在这里! 六种常用分类方法包括两种线性分类及四种非线性分类法,分别是: 一.线性判别分析 from sklearn.model_selection i ...

  9. 2023年美赛C题Wordle预测问题一建模及Python代码详细讲解

    相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 (3)2023年美赛C题Wordl ...

  10. 2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解

    更新时间:2023-2-19 16:30 相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详 ...

最新文章

  1. 面试谈薪,被 HR 压价,怎么办?
  2. 大数据量表中,增加一个NOT NULL的新列
  3. extjs之TypeError: d.read is not a function解决方案
  4. DL HARQ UCI in PUCCH — R16
  5. 一句话讲清楚GIL锁
  6. python绘制两个离散变量关系图——马赛克图
  7. 计算机日志研究方法,基于日志的计算机取证技术研究与实现
  8. @RestControllerAdvice与@ControllerAdvice的区别
  9. 深入理解JVM虚拟机-Ubuntu中安装openJDK
  10. 2020ccks知识图谱问答总结
  11. 四旋翼无人机原理以及组装过程
  12. 笔记本取消fn +功能键
  13. p-7-24青蛙跳台阶
  14. 目前的云计算,主要存在的问题有哪些?
  15. 随笔——物质与思想(或称意识)
  16. cogs 448. 神牛果 神奇好理解的思路
  17. android GPS 定位
  18. 如何优雅的在mac上使用latex
  19. 跟我一起做微信开发(一)——开通微信公共号(开发模式)
  20. DocuWare 文件管理与工作流程自动化案例研究——DocuWare 工作流程功能使在家工作的员工能够保持沟通和高效工作,支持混合环境

热门文章

  1. 论文阅读:Region Proposal by Guided Anchoring
  2. gentoo linux软件安装,Gentoo Linux 快速安装方法安装
  3. 五、构建deb软件安装包
  4. 通过css为类生成器给文本字体加上书名号,
  5. http://www.cnblogs.com/xd502djj/p/3473516.html
  6. Django | ORM choices参数详解
  7. MSP430第三十二章:Comp_B
  8. oracle rman delete backupset,RMAN Crosscheck后delete obsolete遇到RMAN-06091的解决
  9. html在搜索栏中加入放大镜,CSS3 搜索条动画(放大镜图标展开为长方形输入框)...
  10. Android放大镜实现的两种方式