JsonPath使用和示例

简介: JsonPath使用和示例

1 简介

  • 官网:https://goessner.net/articles/JsonPath/
  • JsonPath 是一种简单的方法来提取给定JSON文档的部分内容;
  • JsonPath 支持多种编程语言,如JavascriptJavaPythonPHP

2 官方实例

  • 下边是官方给出的一个JSON实例数据,便于后续分析:
{
   
    "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
    }
  }
}

3 JsonPath与XPath语法对比

Xpath JsonPath 描述
/ $ 根节点
. @ 现行节点
/ . 或 [] 取子节点
取父节点,Jsonpath未支持
@ 根据属性访问,Jsonpath未支持,因为Json是个Key-value递归结构,不支持属性访问
* * 匹配所有元素节点
[] [] 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)
竖线 [,] 支持迭代器中做多选。连接操作符在XPath 结果合并其它结点集合。Jsonpath允许name或者数组索引。
[] ?() 支持过滤操作
[start: end: step] 数组分割操作从ES4借鉴
() 脚本表达式,使用底层脚本引擎。支持表达式计算
() Xpath分组;JsonPath不支持

4 实例说明JsonPath与XPath语法

  • 通过步骤2中的官方实例,简单看下JsonPathXPath语法的区别:
XPath JsonPath 描述
/store/book/author $.store.book[*].author 获取店内所有书籍的作者
//author $..author 获取所有作者
/store/* $.store.* 获取store的所有元素。所有的bookbicycle
/store//price $.store..price 获取store里面所有东西的价格
//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的书
//* $..* 获取所有元素

5 Python中JsonPath模块

pip install jsonpath

在这里插入图片描述

6 Python中JsonPath使用

# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/7/31 
# 文件名称:json_path.py
# 作用:jsonpath
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import jsonpath as jp

data = {
   
    "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
    }
  }
}
# 获取店内所有书籍的作者
author = jp.jsonpath(data, '$.store.book[*].author')
print(author)

# 输出
['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']
# 获取所有作者
all_aythor = jp.jsonpath(data, '$..author')
print(all_aythor)

# 输出
['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']
# 获取store的所有元素
book_bicycle = jp.jsonpath(data, '$.store.*')
print(book_bicycle)

# 输出
[[{
   
   '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}], {
   
   'color': 'red', 'price': 19.95}]
# 获取store里面所有东西的价格
price = jp.jsonpath(data, "$.store..price")
print(price)

# 输出
[8.95, 12.99, 8.99, 22.99, 19.95]
# 获取最后一本书的所有信息
last_book = jp.jsonpath(data, '$.store..book[-1:]')
print(last_book)

# 输出:
[{
   
   'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]
# 过滤出价格低于10的书
p = jp.jsonpath(data, '$.store..book[?(@.price<10)]')
print(p)

# 输出:
[{
   
   'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}, {
   
   'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99}]

7 结合接口测试的实例

# 登陆接口
http://127.0.0.1/zentao/api.php/v1/tokens
data = {
   
   "account": "admin", "password": "123456"}
# 获取我的个人信息
http://127.0.0.1/zentao/api.php/v1/user
  • 实例:
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/7/31 
# 文件名称:json_path.py
# 作用:jsonpath
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import jsonpath as jp
import requests
import json

base_url = "http://127.0.0.1/zentao/api.php/v1"
token_url = base_url + "/tokens"
info_rurl = base_url + "/user"

header = {
   
   "Content-Type": "application/json"}
data = {
   
   "account": "admin", "password": "ZenTao123456"}

r_data = json.dumps(data)
r = requests.post(url=token_url, data=r_data, headers=header)

r_token = jp.jsonpath(r.json(), '$..token')
print(r_token)

data1 = {
   
   "token": r_token[0]}
headers = dict(header, **data1)
r1 = requests.get(url=info_rurl, headers=headers)
print(r1.text)
  • 输出:
['14333e8b34595c5d22794e14c401a125']
{
   
   "profile":{
   
   "id":1,"company":0,"type":"inside","dept":0,"account":"admin","role":
{
   
   "code":"","name":""},
"realname":"admin","pinyin":"","nickname":"","commiter":"","avatar":null,"birthday":null,"gender":"f","email":"","skype":"","qq":"","mobile":"","phone":"","weixin":"","dingding":"","slack":"","whatsapp":"","address":"","zipcode":"","nature":null,"analysis":null,"strategy":null,"join":null,"visits":5,"visions":",rnd,lite,","ip":"127.0.0.1","last":"2023-07-31T06:14:45Z","fails":0,"locked":null,"feedback":"0","ranzhi":"","ldap":"","score":0,"scoreLevel":0,"resetToken":"","deleted":"0","clientStatus":"offline","clientLang":"zh-cn","admin":true,"superReviewer":false,"view":
{
   
   "account":"admin","programs":"","products":"","projects":"","sprints":""}}}
目录
相关文章
|
1月前
|
人工智能 自然语言处理 安全
“养龙虾玩Skill”指南!OpenClaw(Clawdbot)阿里云/本地部署+新手3种 Skill 挖掘AI工具核心价值
OpenClaw(昵称“龙虾”)的爆火,让“养龙虾玩Skill”成了2026年的新潮流——有人用它自动化处理工作,有人靠定制部署服务变现,甚至闲鱼上500元一次的上门部署生意都应运而生。但多数新手入手后,只停留在基础对话层面,殊不知OpenClaw的核心价值藏在Skill生态中——这些可执行的“能力单元”,就像一个个专属机器人,能将自然语言指令转化为实际操作,从文档处理到硬件控制,覆盖全场景需求。
2885 5
|
移动开发 JavaScript 前端开发
Element Plus for Vue 3 入门教程
Element Plus 是为了适配 Vue 3 对 Element UI 进行的重构。Vue 3.0 的这次大版本升级,对于第三方组件库来说是一件好事,那些已经修修补补无数次,还无法彻底解决的问题,在这次面向 Vue 3.0 重构时,一次性全部解决。
3990 0
|
2月前
|
人工智能 前端开发 IDE
AI 原生研发范式:从“代码中心”到“文档驱动”的演进
本文讲述在 AI 编程时代,通过 SDD解决上下文腐烂、审查瘫痪、维护断层三大工程失序问题,并提供一套轻量、可落地的人机协作 SOP。
AI 原生研发范式:从“代码中心”到“文档驱动”的演进
|
Serverless
📢大模型服务平台百炼“流程”功能下线通知
本文主要内容介绍了大模型服务平台百炼的“流程”功能将于2025年11月15日下线。自通知发布起,“流程”入口将逐步隐藏,建议用户尽快迁移至全新升级的工作流应用,支持MCP、函数计算及大模型节点编排,操作更便捷。2025年6月15日起,现存“流程”不可修改;11月15日起完全停用,智能体中需解除“流程”引用并替换为工作流。请参考相关文档完成迁移。
764 0
|
10月前
快手同城用户点赞关注脚本,快手评论区精准性别年龄点赞收藏插件,按键精灵智能稳定版
这是一套针对快手平台的自动化营销工具源码,利用其较低的风控限制,通过脚本实现私信、点赞等功能,提升营销效率。支持自定义点赞次数与话术
|
缓存 fastjson Java
FastJson - JSONPath 使用
FastJson - JSONPath 使用
2126 0
|
机器学习/深度学习
《深度学习梯度消失问题:原因与解决之道》
梯度消失是深度学习训练中的常见问题,严重影响模型性能。其原因包括激活函数选择不当(如Sigmoid)、网络层次过深和权重初始化不合理。解决方法有:选择合适激活函数(如ReLU及其变种)、优化权重初始化(如Xavier、He初始化)、采用批量归一化、引入残差连接、使用LSTM等特殊结构、调整学习率及预训练加微调等策略。
1231 8
|
存储 关系型数据库 MySQL
Mysql 用户管理(创建、删除、改密、授予权限、取消权限)
Mysql 用户管理(创建、删除、改密、授予权限、取消权限)
1525 0
|
JavaScript Linux 开发工具
CentOS7下安装nvm
CentOS7下安装nvm
3987 0
|
安全 Java 开发者
Java中的Path类使用详解及最佳实践
Java中的Path类使用详解及最佳实践