在Python中操纵json数据的最佳方式
本文示例代碼及文件已上傳至我的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類的第三方庫,可以幫助我們實現很多進階靈活的操作,我們將在下一篇文章中繼續討論。
以上就是本文的全部內容,歡迎在評論區與我進行討論~
推薦閱讀
Pandas處理數據太慢,來試試Polars吧!
懶人必備!只需一行代碼,就能導入所有的Python庫
絕!關于pip的15個使用小技巧
介紹10個常用的Python內置函數,99.99%的人都在用!
可能是全網最完整的 Python 操作 Excel庫總結!
總結
以上是生活随笔為你收集整理的在Python中操纵json数据的最佳方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 别再问我如何双击打开.ipynb文件了!
- 下一篇: 腾讯年度性爱报告被曝,最后一条数据我羞愧