本文示例程式碼及檔案已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
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
類的第三方庫,可以幫助我們實現很多進階靈活的操作,我們將在下一篇文章中繼續討論。
以上就是本文的全部內容,歡迎在評論區與我進行討論~