python之jsonpath的使用

news2024/9/24 17:13:36

文章目录

    • 介绍
    • 安装
    • 语法
      • 语法规则
      • 举例说明
    • 在 python 中使用
      • 获取所有结构
      • 所有子节点的作者
      • 获取所有子孙节点
      • 获取所有价格
      • 取出第三本书的所有信息
      • 取出价格大于70块的所有书本
      • 从mongodb 中取数据的示例

介绍

JSONPath能在复杂的JSON数据中 查找和提取所需的信息,它是一种功能强大的查询语言,可以通过简单的表达式来快速准确地定位和提取JSON数据。本文将介绍JSONPath的基本语法和用法,并为您展示如何封装和使用JSONPath方法来处理和操作JSON数据。
JSONPath类似于XPath提供了一种更简洁、灵活和高效的方式来查询、定位和提取JSON数据中的内容

安装

pip install jsonpath

语法

from jsonpath import jsonpath
res = jsonpath(dict,'jsonpath语法规则字符串')

语法规则

JsonPath描述
$根节点元素,最外层的大括号
@当前节点元素
. 或 []绝对路径,取子节点元素
相对路径,内部的任意位置,选择符合条件的子孙节点元素
*匹配所有元素节点
[]迭代器提示(可以在里边做简单的迭代操作,如数组下标,根据内容筛选)
[,]支持迭代器中做多选
?()支持过滤操作
()支持表达式计算

举例说明

获取书架上的书进行操作

  • 数据结构:
book_dict = {
    "store":{
        "book":[
            {
                "name": "java 核心编程1",
                "price": "65",
                "isbn": "IS002598934",
                "author" : "周立新"
            },
            {
                "name": "java 核心编程2",
                "price": "64",
                "isbn": "IS876430456",
                "author": "周立新"
            },
            {
                "name" : "java 编程思想",
                "price": "120",
                "isbn": "IS256709873",
                "author": "Bruce Eckel"
            },
            {
                "name" : "RabbitMq 实战指南",
                "price": "79",
                "isbn": "IS987623450",
                "author": "朱忠华"
            },
            {
                "name" : "图解 TCP/IP",
                "price": "69",
                "isbn": "IS9787354679",
                "author": "竹下隆史"
            }
        ]
    }
}
  • 结构解析例子
JsonPath结果
$.store.book[*].authorstore 中的所有的 book的作者
$…store.*所有的书籍
$.store…pricestore 中的所有的内容的价格
$…book[2]第三本书
$…book[(@.length-1)] 或 $…book[-1:]最后一本书
$…book[0,1] 或 $…book[:2]前两本书
$…book[?(@.isbn)]获取有 isbn 的所有数
$…book[?(@.price<100)]获取价格<100的所有的书
$…*获取所有的数据

在 python 中使用

如下代码都用单元测试来举例,具体代码链接:去这里

  • 设置测试结构
def setUp(self):
  """
  前置设置
  @return:
  """
  self.book_dict = {
      "store": {
          "book": [
              {
                  "name": "java 核心编程1",
                  "price": 65,
                  "isbn": "IS002598934",
                  "author": "周立新"
              },
              {
                  "name": "java 核心编程2",
                  "price": 64,
                  "isbn": "IS876430456",
                  "author": "周立新"
              },
              {
                  "name": "java 编程思想",
                  "price": 120,
                  "isbn": "IS256709873",
                  "author": "Bruce Eckel"
              },
              {
                  "name": "RabbitMq 实战指南",
                  "price": 79,
                  "isbn": "IS987623450",
                  "author": "朱忠华"
              },
              {
                  "name": "图解 TCP/IP",
                  "price": 69,
                  "isbn": "IS9787354679",
                  "author": "竹下隆史"
              }
          ]
      }
  }
  pass

获取所有结构

def test_all(self):
    """
    获取所有的结构
    @return:
    """
    dict_data = jsonpath(self.book_dict, '$..*')
    print("查看dict_data支持的属性和方法:", dir(dict_data))

    try:
        for item in dict_data[0]['book']:
            # 美化打印
            pprint(item)
    except Exception as e:
        print(e)
        pass

所有子节点的作者

def test_sub_author(self):
    """
    获取所有子节点的作者
    @return:
    """
    all_author = jsonpath(self.book_dict, '$.store.book[*].author')
    print(all_author)
    pass

获取所有子孙节点

def test_sub_all(self):
    """
    获取所有子孙节点
    @return:
    """
    sub_all = jsonpath(self.book_dict, '$..store.*')
    print(sub_all)
    pass

获取所有价格

def test_price_all(self):
    """
    获取子节点的所有价格
    @return:
    """
    price_all = jsonpath(self.book_dict, '$..price')
    print("所有的价格:", price_all)

    price_sum = sum([int(price) for price in price_all])
    print(f"价格之和:{price_sum}")
    pass

取出第三本书的所有信息

 def test_book_item(self):
     """
     取出第三本书的所有信息
     @return:
     """
     book_item = jsonpath(self.book_dict, '$..book[2]')
     print(book_item)
     pass

取出价格大于70块的所有书本

def test_book_filter(self):
    book_count = jsonpath(self.book_dict, '$..book[?(@.price>70)]')
    print(book_count)

从mongodb 中取数据的示例

遇到复杂的结构可以使用 pprint()来美化打印

def test_mongo_data(self):
    """
    获取mongo中的复杂结构的数据
    @return:
    """
    dict_data = MongoPool().project_8.coffer_check_data.find_one({"_id": "629dbfe615e74466831b5ce2"})
    # 美化打印
    pprint(dict_data)
    change_list = jsonpath(dict_data, '$..change')
    print("获取某一个字字段的列表:", change_list)
    pass

效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.1 用源文件写汇编代码

汇编语言 1. 源程序 1.1 伪指令 汇编指令是有对应的机器码的指令&#xff0c;可以被编译为机器指令&#xff0c;最终为CPU所执行伪指令没有对应的机器指令&#xff0c;最终不被CPU所执行伪指令是由编译器来执行的指令&#xff0c;编译器根据伪指令来进行相关的编译工作 1.2…

【链表】Leetcode 19. 删除链表的倒数第 N 个结点【中等】

删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 解题思路 1、使用快慢指针找到要删除节点的前一个节点。2、删…

国际数字影像产业园:专注于数字影像领域的成都数字产业园

国际数字影像产业园&#xff08;数媒大厦&#xff09;&#xff0c;作为一个专注于数字影像产业的成都数字产业园&#xff0c;其服务优势体现在三大生态服务体系&#xff1a;公共服务、公务服务、产业服务。这三大服务体系不仅共享化、数字化、产业化&#xff0c;更致力于为企业…

带你玩透浮动float布局,详解(一)

文章目录 一 认识浮动二 浮动的规则浮动的规则一代码展示 浮动规则二代码展示 浮动规则四代码展示代码展示 浮动规则五 空隙的解决方案代码展示:第一种方式 放在一行第二种解决方式&#xff08;不推荐使用这种方式&#xff09;第三种方式采用浮动&#xff08;推荐&#xff0c;统…

用户中心项目(登录 + 用户管理功能后端)

文章目录 1.登录功能-后端1.思路分析2.完成对用户名和密码的校验1.com/sun/usercenter/service/UserService.java 添加方法2.com/sun/usercenter/service/impl/UserServiceImpl.java 添加方法3.com/sun/usercenter/service/impl/UserServiceImpl.java 新增属性 3.记录用户的登录…

SpringBoot如何写好单元测试

&#x1f413;序言 Spring中的单元测试非常方便&#xff0c;可以很方便地对Spring Bean进行测试&#xff0c;包括Controller、Service和Repository等Spring Bean进行测试&#xff0c;确保它们的功能正常&#xff0c;并且不会因为应用的其他变化而出现问题。 &#x1f413;单元测…

借教室与差分

原题 题目描述 在大学期间&#xff0c;经常需要租借教室。 大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。 教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。  面对海量租借教室的信息&…

Wmware安装Linux(centerOS、Ubuntu版本)

目录 1、安装wmware 2、center版本 3、ubuntu版本 1、安装wmware 此处不做展开。 2、center版本 需要提前下载的文件&#xff1a; 无图形化界面https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso 有图形化界面https://mirrors.a…

nacos 更新报错“发布失败。请检查参数是否正确”

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容起因解决方案结果 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华…

Lenze伦茨8400变频器E84A L-force Drives 操作使用说明

Lenze伦茨8400变频器E84A L-force Drives 操作使用说明

深度强化学习03价值学习

Q*类似于先知&#xff0c;知道动作的后果 价值学习是得到一个近似的价值函数

ubuntu20.04搭建rtmp视频服务

1.安装软件 sudo apt-get install ffmpeg sudo apt-get install nginx sudo apt-get install libnginx-mod-rtmp 2.nginx配置 修改/etc/nginx/nginx.conf文件&#xff0c;在末尾添加&#xff1a; rtmp {server {listen 1935;application live {live on;}} } 3.视频测试 本…

Linux系统Docker安装Drupal并配置数据库实现公网远程访问本地站点

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

Spring MVC(二)-过滤器与拦截器

过滤器和拦截器在职责和使用场景上存在一些差异。 过滤器 拦截器 作用 对请求进行预处理和后处理。例如过滤请求参数、设置字符编码。 拦截用户请求并进行相应处理。例如权限验证、用户登陆检查等。 工作级别 Servlet容器级别&#xff0c;是Tomcat服务器创建的对象。可以…

Cannot run program “C:\Program Files\Java\jdk-17\bin\java.exe“

错误提示&#xff1a;Cannot run program “C:\Program Files\Java\jdk-17\bin\java.exe” 解决办法&#xff1a; 检查环境变量是否配置是否正确检查项目环境是否正确&#xff0c;可能会出现多个JDK版本&#xff0c;将不需要的删除

Flume入门概述及安装部署

目录 一、Flume概述1.1 Flume定义1.2 Flume基础架构 二、Flume安装部署 一、Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 1.2 Flume基础…

Nebula Graph-03-NebulaGraph Studio-可视化web工具安装和使用

前言 如果未安装NebulaGraph&#xff0c;可以去看Nebula Graph-01-Nebula Graph简介和安装以及客户端连接 NebulaGraph Studio-可视化web工具安装 1&#xff1a;什么是 NebulaGraph Studio NebulaGraph Studio&#xff08;简称 Studio&#xff09;是一款可以通过 Web 访问的…

一篇文章教会你如何用 Axure 画原型图

原型图对于做出更好的 UI 设计决策非常重要。然而&#xff0c;选择合适的原型工具并不容易。我们需要仔细考虑成本、功能、与其他设计工具的集成、学习曲线、协作功能和用户测试方法&#xff0c;本文将分析 Axure 的原型设计工具。 1、为何使用 Axure 绘制原型图&#xff1f; …

【喜讯】同邦集团正式成为广州数据交易所会员!高效开展数据管理。

近日&#xff0c;同邦信息科技顺利通过广州数据交易所数商会员资格审查&#xff0c;正式加入广州数据交易所数商生态。 据悉&#xff0c;2022年9月&#xff0c;广州数据交易所正式挂牌成立。广州数据交易所采用“一所多基地多平台”的体系架构进行运营&#xff0c;探索在条件成…

CSA发布| 科技创新和云计算趋势中的网络安全因素

关注国际云安全联盟公众号&#xff0c;回复关键词 “云安全”&#xff0c;即可获取报告完整版 随着云计算的高速发展&#xff0c;如何在云环境中保障数据和应用的安全性日益成为企业共同的关注点&#xff0c;企业也正在考虑多云和混合云策略。云原生技术如容器、微服务和无服务…