Python JSONPath進(jìn)階實(shí)戰(zhàn)之高效查詢技巧全解析
一、JSONPath 簡介
JSONPath 是一種用于在 JSON 文檔中定位和提取數(shù)據(jù)的查詢語言,類似于 XPath 在 XML 中的作用
核心功能
- 導(dǎo)航 JSON 數(shù)據(jù)結(jié)構(gòu)
- 提取特定節(jié)點(diǎn)或值
- 過濾符合條件的元素
- 支持復(fù)雜條件查詢
二、基礎(chǔ)語法詳解
1. 根元素與子節(jié)點(diǎn)
| 語法 | 說明 | 示例 | 結(jié)果解釋 |
|---|---|---|---|
| $ | 根對象 | $ | 整個 JSON 文檔 |
| . | 子節(jié)點(diǎn)訪問 | $.store | store 對象 |
| [] | 子節(jié)點(diǎn)訪問(替代) | $['store'] | store 對象 |
2. 通配符與多選
| 語法 | 說明 | 示例 | 結(jié)果解釋 |
|---|---|---|---|
| * | 匹配所有元素 | $.* | 根下的所有直接子節(jié)點(diǎn) |
| .* | 對象的所有屬性 | $.store.* | store 的所有直接子節(jié)點(diǎn) |
| [a,b] | 選擇多個指定鍵 | $['a','b'] | 返回 a 和 b 的值 |
三、數(shù)組操作深度解析
1. 索引與切片
// 示例數(shù)據(jù) [10, 20, 30, 40, 50]
| 表達(dá)式 | 結(jié)果 | 說明 |
|---|---|---|
| $[0] | 10 | 第一個元素(索引從0開始) |
| $[-1] | 50 | 最后一個元素 |
| $[1:3] | [20, 30] | 切片(左閉右開) |
| $[2:] | [30,40,50] | 從索引2到結(jié)束 |
| $[:3] | [10,20,30] | 從開始到索引3(不包括索引3) |
| $[0,2,4] | [10,30,50] | 選擇多個指定索引 |
2. 遞歸下降操作符
// 示例數(shù)據(jù)
{
"a": {"x": 1},
"b": [{"x": 2}, {"y": 3}],
"x": 4
}| 表達(dá)式 | 結(jié)果 | 說明 |
|---|---|---|
| $..x | [1, 2, 4] | 所有層級的 x 屬性 |
| $..* | 所有值 | 遞歸返回所有節(jié)點(diǎn)值 |
| $..[0] | [{"x":2}] | 所有數(shù)組的第一個元素 |
四、高級查詢技術(shù)
1. 過濾表達(dá)式
// 示例數(shù)據(jù):商品列表
[
{"id": 1, "name": "Laptop", "price": 1200, "stock": 5},
{"id": 2, "name": "Mouse", "price": 25, "stock": 0},
{"id": 3, "name": "Keyboard", "price": 80, "stock": 10}
]| 表達(dá)式 | 結(jié)果 | 說明 |
|---|---|---|
| $[?(@.price < 100)] | [Mouse, Keyboard] | 價格低于100的商品 |
| $[?(@.stock > 0)] | [Laptop, Keyboard] | 有庫存的商品 |
| $[?(@.name == 'Laptop')] | [Laptop] | 名稱為Laptop的商品 |
| $[?(@.name =~ /^M.*/i)] | [Mouse] | 名稱以M開頭的商品 |
2. 復(fù)雜條件組合
| 表達(dá)式 | 結(jié)果 | 說明 |
|---|---|---|
| $[?(@.price >= 50 && @.price <= 100)] | [Keyboard] | 價格在50-100之間的商品 |
| $[?(@.stock == 0 || @.price > 1000)] | [Laptop, Mouse] | 無庫存或價格高于1000的商品 |
| $[?(!@.stock)] | [Mouse] | 沒有stock屬性的商品 |
五、函數(shù)擴(kuò)展(實(shí)現(xiàn)相關(guān))
1. 常用函數(shù)
| 函數(shù) | 說明 | 示例 | 結(jié)果 |
|---|---|---|---|
| length() | 數(shù)組/字符串長度 | $[?(@.tags.length()>1)] | 標(biāo)簽>1的項 |
| min() | 最小值 | $.prices.min() | 最低價格 |
| max() | 最大值 | $.prices.max() | 最高價格 |
| avg() | 平均值 | $.prices.avg() | 平均價格 |
2. 類型檢查
| 表達(dá)式 | 說明 |
|---|---|
| $[?(@.price typeof 'number')] | 價格是數(shù)字類型的項 |
| $[?(@.name typeof 'string')] | 名稱是字符串類型的項 |
六、綜合實(shí)戰(zhàn)示例
示例數(shù)據(jù)
{
"company": "TechCorp",
"departments": [
{
"name": "Dev",
"employees": [
{"id": 101, "name": "Alice", "salary": 8000, "skills": ["Java", "Python"]},
{"id": 102, "name": "Bob", "salary": 7500, "skills": ["JavaScript"]}
]
},
{
"name": "QA",
"employees": [
{"id": 201, "name": "Charlie", "salary": 7000, "skills": ["Testing", "Automation"]},
{"id": 202, "name": "Diana", "salary": 8500}
]
}
]
}查詢示例
1.獲取所有員工對象:
$..employees[*]
2.查找工資超過7800的員工:
$..employees[?(@.salary > 7800)]
// 結(jié)果:[{"id":101,...}, {"id":202,...}]3.獲取Dev部門員工的姓名:
$.departments[?(@.name == 'Dev')].employees[*].name // 結(jié)果:["Alice", "Bob"]
4.查找掌握J(rèn)ava技能的員工:
注意:Python 的 jsonpath 庫對 contains 的支持可能有限
方法1:使用 jsonpath-ng 庫(功能更強(qiáng)大)
# 先安裝:pip install jsonpath-ng
from jsonpath_ng import parse
?
# 更可靠的查詢
expr = parse("$..employees[?(@.skills contains 'Java')]")
matches = [match.value for match in expr.find(json_dict)]方法2:使用in關(guān)鍵字
res = jsonpath.jsonpath(json_dict,"$..employees[?('Java' in @.skills)]")方法3:使用正則表達(dá)式匹配
# 使用正則表達(dá)式匹配 res = jsonpath.jsonpath(json_dict, "$..employees[?(@.skills =~ /.*Java.*/i)]")
5.統(tǒng)計QA部門員工數(shù):
方法1:使用 jsonpath-ng 庫(功能更強(qiáng)大,支持length()方法)
$.departments[?(@.name == 'QA')].employees.length() // 結(jié)果:2
方法2:使用jsonpath庫(不支持length()方法),使用python的len()函數(shù)
res = jsonpath.jsonpath(json_dict,"$.departments[?(@.name == 'QA')].employees.*") print(len(res))
6.獲取所有技能列表(去重):
$..skills[*] // 結(jié)果:["Java", "Python", "JavaScript", "Testing", "Automation"]
七、注意事項與最佳實(shí)踐
1.大小寫敏感:
$.Store // 錯誤(應(yīng)為小寫s) $.store // 正確
2.特殊字符處理:
$['special-key'] // 包含連字符的鍵 $['@attribute'] // 以@開頭的鍵
3.性能優(yōu)化:
- 避免過度使用遞歸
.. - 盡量使用具體路徑而非通配符
- 先過濾后處理
4.實(shí)現(xiàn)差異:
- 不同語言的庫支持程度不同
- 函數(shù)擴(kuò)展非標(biāo)準(zhǔn)實(shí)現(xiàn)
- 空值處理方式可能不同
到此這篇關(guān)于Python JSONPath進(jìn)階實(shí)戰(zhàn)之高效查詢技巧全解析的文章就介紹到這了,更多相關(guān)Python JSONPath內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)獲取漢字偏旁部首的方法示例【測試可用】
這篇文章主要介紹了Python實(shí)現(xiàn)獲取漢字偏旁部首的方法,涉及Python基于第三方模塊進(jìn)行漢字處理的相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
10 行Python 代碼實(shí)現(xiàn) AI 目標(biāo)檢測技術(shù)【推薦】
這篇文章主要介紹了10 行Python 代碼,實(shí)現(xiàn) AI 目標(biāo)檢測技術(shù),看完了代碼,我們在一起聊聊目標(biāo)檢測背后的技術(shù)背景,并解讀這10行Python代碼的由來和實(shí)現(xiàn)原理。感興趣的朋友跟隨小編一起看看吧2019-06-06
解決python遞歸函數(shù)及遞歸次數(shù)受到限制的問題
這篇文章主要介紹了解決python遞歸函數(shù)及遞歸次數(shù)受到限制的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Python使用SQLAlchemy模塊實(shí)現(xiàn)操作數(shù)據(jù)庫
SQLAlchemy 是用Python編程語言開發(fā)的一個開源項目,它提供了SQL工具包和ORM對象關(guān)系映射工具,使用SQLAlchemy可以實(shí)現(xiàn)高效和高性能的數(shù)據(jù)庫訪問,下面我們就來學(xué)習(xí)一下SQLAlchemy模塊的具體應(yīng)用吧2023-11-11
在pycharm中實(shí)現(xiàn)刪除bookmark
今天小編就為大家分享一篇在pycharm中實(shí)現(xiàn)刪除bookmark,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02

