JSONPath使用案例讲解

ops/2024/12/27 17:21:47/

JSONPath 是一种用于查询和提取 JSON 数据的语言,它类似于 XPath,主要用于解析和提取 JSON 文档中的特定数据。以下是一些常见的实际使用场景,并结合这些场景给出 JSONPath 的使用说明。

1. 提取指定字段的值

场景:

你有一个 JSON 数据,表示一名学生的成绩单,想要提取学生的名字和数学成绩。

{"student": {"name": "John Doe","age": 20,"scores": {"math": 85,"english": 90}}
}
JSONPath 表达式:
  • 提取学生的名字: $.student.name
  • 提取数学成绩: $.student.scores.math
说明:
  • $.student.name 会返回 "John Doe"
  • $.student.scores.math 会返回 85

2. 提取数组中的元素

场景:

你有一个 JSON 数据表示多个学生及其成绩,想要提取所有学生的数学成绩。

{"students": [{"name": "John Doe", "scores": {"math": 85, "english": 90}},{"name": "Jane Smith", "scores": {"math": 92, "english": 88}},{"name": "Mike Johnson", "scores": {"math": 78, "english": 85}}]
}
JSONPath 表达式:
  • 提取所有学生的数学成绩: $.students[*].scores.math
说明:
  • [*] 用于选择数组中的所有元素。
  • 该表达式返回 [85, 92, 78],即所有学生的数学成绩。

3. 提取嵌套数组中的特定元素

场景:

你有一个 JSON 数据表示订单信息,想要提取所有订单中价格大于 50 的商品名称。

{"orders": [{"orderId": "001","items": [{"name": "item1", "price": 45},{"name": "item2", "price": 55}]},{"orderId": "002","items": [{"name": "item3", "price": 60},{"name": "item4", "price": 30}]}]
}
JSONPath 表达式:
  • 提取价格大于 50 的商品名称: $.orders[*].items[?(@.price > 50)].name
说明:
  • ?(@.price > 50) 是一个过滤器,表示只选择价格大于 50 的商品。
  • 该表达式返回 ["item2", "item3"],即符合条件的商品名称。

4. 提取嵌套对象中的某些属性

场景:

你有一个 JSON 数据表示图书信息,想要提取所有书名和出版年份。

{"library": {"books": [{"title": "Book A", "author": "Author A", "year": 2020},{"title": "Book B", "author": "Author B", "year": 2019},{"title": "Book C", "author": "Author C", "year": 2021}]}
}
JSONPath 表达式:
  • 提取所有书名和出版年份: $.library.books[*]['title', 'year']
说明:
  • ['title', 'year'] 用来选择多个属性。
  • 该表达式返回 [{"title": "Book A", "year": 2020}, {"title": "Book B", "year": 2019}, {"title": "Book C", "year": 2021}],即每本书的标题和出版年份。

5. 获取对象中不存在的字段

场景:

你有一个 JSON 数据表示一个用户的基本信息,想要提取所有字段,包括用户没有提供的字段(即值为 null 的字段)。

{"user": {"name": "Alice","email": null,"phone": "123-456-7890"}
}
JSONPath 表达式:
  • 提取所有字段: $.user.*
说明:
  • * 用于选择对象中的所有字段。
  • 该表达式返回 [ "Alice", null, "123-456-7890" ],即所有字段的值,包括 null

6. 提取数组中的部分元素

场景:

你有一个 JSON 数组表示多个用户的信息,想要提取前两个用户的名字。

{"users": [{"name": "John", "age": 30},{"name": "Jane", "age": 25},{"name": "Doe", "age": 22}]
}
JSONPath 表达式:
  • 提取前两个用户的名字: $.users[0,1].name
说明:
  • [0,1] 用来选择数组中的第一个和第二个元素。
  • 该表达式返回 ["John", "Jane"],即前两个用户的名字。

7. 提取数组元素的部分

场景:

你有一个 JSON 数组表示多个订单,想要提取所有订单的前两项。

{"orders": [{"orderId": "001", "amount": 100},{"orderId": "002", "amount": 150},{"orderId": "003", "amount": 200}]
}
JSONPath 表达式:
  • 提取前两项订单: $.orders[0:2]
说明:
  • [0:2] 表示提取数组中的前两项(索引 0 和 1)。
  • 该表达式返回 [ {"orderId": "001", "amount": 100}, {"orderId": "002", "amount": 150} ]

8. 使用递归 descent(递归下降)

场景:

你有一个嵌套的 JSON 数据,想要查找所有的 name 字段,不管它们处于什么层级。

{"company": {"department": {"name": "Engineering","members": [{"name": "John", "role": "Developer"},{"name": "Jane", "role": "Manager"}]},"department": {"name": "Marketing","members": [{"name": "Doe", "role": "Analyst"},{"name": "Alice", "role": "Head"}]}}
}
JSONPath 表达式:
  • 查找所有 name 字段: $.company..name
说明:
  • .. 是递归下降运算符,它会递归地查询所有层级中的 name 字段。
  • 该表达式返回 ["Engineering", "John", "Jane", "Marketing", "Doe", "Alice"],即所有层级中的 name 字段的值。

总结

JSONPath 提供了一种强大的方式来从 JSON 数据中查询和提取特定的信息。它能够支持从简单的字段提取到复杂的嵌套结构、过滤和递归查询等功能,适用于在处理和分析大量 JSON 数据时的各种需求。


http://www.ppmy.cn/ops/145433.html

相关文章

五十五:服务器端的主动消息推送

随着互联网技术的发展,用户体验和实时性成为应用服务的重要指标。传统的客户端轮询(polling)模式逐渐无法满足实时数据更新的需求,而服务器端的主动消息推送技术应运而生,为开发者和用户带来了更高效的解决方案。 主动…

JVM【Java虚拟机】基础知识(五)

1. 双亲委派机制 由于Java虚拟机中有多个类加载器,双亲委派机制的核心是解决一个类到底由谁加载的问题。 💡双亲委派机制有什么用? 1.保证类加载的安全性 通过双亲委派机制避免恶意代码替换JDK中的核心类库,比如java.lang.Str…

大型语言模型(LLMs)演化树 Large Language Models

大型语言模型(LLMs)演化树 Large Language Models flyfish 下面的图来自论文地址 Transformer 模型(如 BERT 和 GPT-3)已经给自然语言处理(NLP)领域带来了革命性的变化。这得益于它们具备并行化能力&…

入侵他人电脑,实现远程控制(待补充)

待补充 在获取他人无线网网络密码后,进一步的操作是实现入侵他人电脑,这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址(通过伪造的网页、伪造的Windows窗口、hook,信…

ES和MONGODB备份脚本

ES: 使用elasticdump备份: ###URL取svc: elasticsearch-masterd的 clusterip/9200 for item in $(curl http://$URL/_cat/indices | awk {print $3} | grep -E "要备份的索引名称" ) do echo mapping $item elasticdump --inputhttp://$…

数据结构二叉树

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个层次关系的集合,把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下 有一个特殊的结点&…

《Opencv》基础操作详解(2)

接上篇:《Opencv》基础操作详解(1)-CSDN博客 目录 Opencv基础操作 11、B、G、R颜色通道提取 12、显示单个通道颜色 13、 合并颜色通道 14、图像添加马赛克 15、图片区域替换 16、图片的缩放(常用) 17、图像运算…

PyCharm专项练习3 图的存储:邻接矩阵+邻接链表

一、实验目的 本文的实验目的是通过Python编程实践,实现对图的两种存储方式——邻接矩阵和邻接链表的掌握与应用。针对给定的有向图和无向图,通过编码实现这两种存储方式,并能够对图进行输出展示。 二、实验内容 图的存储方式实现&#xff…