1 簡介
在日常使用Python的過程中,我們經常會與json格式的數據打交道,尤其是那種嵌套結構復雜的json數據,從中抽取復雜結構下鍵值對數據的過程枯燥且費事。
而熟悉xpath的朋友都知道,對于xml格式類型的具有層次結構的數據,我們可以通過編寫xpath語句來靈活地提取出滿足某些結構規則的數據。
類似的,JSONPath也是用于從json數據中按照層次規則抽取數據的一種實用工具,在Python中我們可以使用jsonpath這個庫來實現JSONPath的功能。
2 在Python中使用JSONPath提取json數據jsonpath是一個第三方庫,所以我們首先需要通過pip install jsonpath對其進行安裝。
2.1 一個簡單的例子安裝完成后,我們首先來看一個簡單的例子,從而初探其使用方式:
這里使用到的示例json數據來自高德地圖步行導航接口,包含了從天安門廣場到西單大悅城的步行導航結果,原始數據如下,層次結構較深:
假如我想要獲取其嵌套結構中steps鍵值對下每段行程的耗時duration數據,配合jsonpath就可以這樣做:
import json
from jsonpath import jsonpath
# 讀入示例json數據with open(‘json示例.json’, encoding=‘utf-8’) as j:
demo_json = json.loads(j.read())
# 配合JSONPath表達式提取數據
jsonpath(demo_json, ‘$..steps[*].duration’)
其中$..steps[*].duration就是我們用于描述數據位置規則的JSONPath語句,配合jsonpath()便可以提取出對應信息,下面我們就來學習jsonpath中支持的常用JSONPath語法:
2.2 jsonpath中的常用JSONPath語法為了滿足日常提取數據的需求,JSONPath中設計了一系列語法規則來實現對目標值的定位,其中常用的有:
「按位置選擇節點」
在jsonpath中主要有以下幾種按位置選擇節點的方式:
功能語法
根節點$
當前節點@
子節點。或[]
任意子節點*
任意后代節點。。
讓我們來演示一下它們的一些用法:
# 提取所有duration鍵對應值
jsonpath(demo_json, ‘$..duration’)
# 提取所有steps鍵的子節點對應instruction值
jsonpath(demo_json, ‘$..steps.*.instruction’)
「索引子節點」
有些時候我們需要在選擇過程中對子節點做多選或按位置選擇操作,就可以使用到jsonpath中的相關功能:
# 多選所有steps鍵的子節點對應的instruction與action值
jsonpath(demo_json, ‘$..steps.*[instruction,action]’)
# 選擇steps鍵的第0個子節點對應的instruction與action值
jsonpath(demo_json, ‘$..steps[0][instruction,action]’)
# 選擇steps鍵的第1到3(不包括3)個子節點對應的instruction與action值
jsonpath(demo_json, ‘$..steps[1:3][instruction,action]’)
# 配合@,選擇steps鍵的最后一個子節點對應的instruction與action值
jsonpath(demo_json, ‘$..steps[(@.length-1)][instruction,action]’)
「條件篩選」
有些時候我們需要根據子節點的某些鍵值對值,對選擇的節點進行篩選,在jsonpath中支持常用的==、!=、》、《等比較運算符,以==比較符為例,這里配合@定位符從當前節點提取子節點,語法為?(@.鍵名 比較符 值):
# 找到所有steps子節點中orientation為“西”的
jsonpath(demo_json, ‘$..steps[?(@.orientation == “西”)]’)
而如果想要提取所有具有指定鍵的節點,可以參考下面的例子:
# 找到所有具有polyline鍵的節點對應的polyline與road鍵對應值
jsonpath(demo_json, ‘$.。[?(@.polyline)][polyline,road]’)
2.3 返回結果的形式在前面的例子中,我們所有的返回結果直接就是提取到的滿足條件的結果,而jsonpath()中還提供了另一種特殊的結果返回形式,只需要設置參數result_type=None就可以改直接返回結果為返回每個結果的JSONPath表達式:
# 獲取結果的JSONPath表達式
jsonpath(demo_json, ‘$.。[?(@.polyline)][polyline,road]’, result_type=None)
以上介紹的均為jsonpath庫中的常規功能,可以滿足基礎的json數據提取需求,而除了jsonpath之外,還有其他具有更加豐富拓展功能的JSONPath類的第三方庫,可以幫助我們實現很多進階靈活的操作。
編輯:jq
-
數據
+關注
關注
8文章
7145瀏覽量
89590 -
XML
+關注
關注
0文章
188瀏覽量
33142 -
python
+關注
關注
56文章
4807瀏覽量
85041 -
JSON
+關注
關注
0文章
119瀏覽量
7011
原文標題:在 Python 中操縱 json 數據的最佳方式
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
云數據庫是哪種數據庫類型?
騰訊ima升級知識庫功能,上線小程序實現共享與便捷問答
Java 23功能介紹
![Java 23<b class='flag-5'>功能</b><b class='flag-5'>介紹</b>](https://file1.elecfans.com/web3/M00/00/FA/wKgZO2dPuOmAC6YoAAAZQa1ialc743.png)
HAL庫和標準庫的區別 HAL庫與CMSIS的關系
HAL庫在STM32開發中的重要性
HAL庫在嵌入式系統中的應用
支持外擴sd卡功能的串口數據庫模塊
Python庫解析:通過庫實現代理請求與數據抓取
軟件系統數據庫的分庫分表設計
![軟件系統數據<b class='flag-5'>庫</b>的分庫分表設計](https://file1.elecfans.com/web2/M00/03/C2/wKgZombGsDeAbXZcAADe-3smVHg464.png)
電動機的常規控制方法
利用NVIDIA的nvJPEG2000庫分析DICOM醫學影像的解碼功能
![利用NVIDIA的nvJPEG2000<b class='flag-5'>庫</b>分析DICOM醫學影像的解碼<b class='flag-5'>功能</b>](https://file1.elecfans.com/web2/M00/E9/D1/wKgZomZVedaAWZmMAAAeFbgpaJE618.png)
數字信號處理DSP庫文件的使用方法和功能實現
![數字信號處理DSP<b class='flag-5'>庫</b>文件的使用方法和<b class='flag-5'>功能</b>實現](https://file1.elecfans.com/web2/M00/C7/BC/wKgaomYM8zOAWxqwAAAefxDp9TQ817.png)
納芯微帶保護功能的單通道隔離驅動NSI6611在電控系統中的運用介紹
![納芯微帶保護<b class='flag-5'>功能</b>的單通道隔離驅動NSI6611在電控系統<b class='flag-5'>中</b>的運用<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/C4/B2/wKgZomX3nnyAJlaTAAAlj-fUZso281.png)
評論