(資料科學學習手札125)在Python中操縱json資料的最佳方式

費弗裡發表於2021-08-01

本文示例程式碼及檔案已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

  在日常使用Python的過程中,我們經常會與json格式的資料打交道,尤其是那種巢狀結構複雜的json資料,從中抽取複雜結構下鍵值對資料的過程枯燥且費事。

  而熟悉xpath的朋友都知道,對於xml格式型別的具有層次結構的資料,我們可以通過編寫xpath語句來靈活地提取出滿足某些結構規則的資料。

  類似的,JSONPath也是用於從json資料中按照層次規則抽取資料的一種實用工具,在Python中我們可以使用jsonpath這個庫來實現JSONPath的功能。

(資料科學學習手札125)在Python中操縱json資料的最佳方式

2 在Python中使用JSONPath提取json資料

  jsonpath是一個第三方庫,所以我們首先需要通過pip install jsonpath對其進行安裝。

2.1 一個簡單的例子

  安裝完成後,我們首先來看一個簡單的例子,從而初探其使用方式:

  這裡使用到的示例json資料來自高德地圖步行導航介面,包含了從天安門廣場到西單大悅城的步行導航結果,原始資料如下,層次結構較深:

(資料科學學習手札125)在Python中操縱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')
(資料科學學習手札125)在Python中操縱json資料的最佳方式

  其中$..steps[*].duration就是我們用於描述資料位置規則的JSONPath語句,配合jsonpath()便可以提取出對應資訊,下面我們就來學習jsonpath中支援的常用JSONPath語法:

2.2 jsonpath中的常用JSONPath語法

  為了滿足日常提取資料的需求,JSONPath中設計了一系列語法規則來實現對目標值的定位,其中常用的有:

  • 按位置選擇節點

  在jsonpath中主要有以下幾種按位置選擇節點的方式:

功能 語法
根節點 $
當前節點 @
子節點 .或[]
任意子節點 *
任意後代節點 ..

  讓我們來演示一下它們的一些用法:

# 提取所有duration鍵對應值
jsonpath(demo_json, '$..duration')
(資料科學學習手札125)在Python中操縱json資料的最佳方式
# 提取所有steps鍵的子節點對應instruction值
jsonpath(demo_json, '$..steps.*.instruction')
(資料科學學習手札125)在Python中操縱json資料的最佳方式
  • 索引子節點

  有些時候我們需要在選擇過程中對子節點做多選或按位置選擇操作,就可以使用到jsonpath中的相關功能:

# 多選所有steps鍵的子節點對應的instruction與action值
jsonpath(demo_json, '$..steps.*[instruction,action]')
(資料科學學習手札125)在Python中操縱json資料的最佳方式
# 選擇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]')
(資料科學學習手札125)在Python中操縱json資料的最佳方式
  • 條件篩選

  有些時候我們需要根據子節點的某些鍵值對值,對選擇的節點進行篩選,在jsonpath中支援常用的==!=><等比較運算子,以==比較符為例,這裡配合@定位符從當前節點提取子節點,語法為?(@.鍵名 比較符 值)

# 找到所有steps子節點中orientation為“西”的
jsonpath(demo_json, '$..steps[?(@.orientation == "西")]')
(資料科學學習手札125)在Python中操縱json資料的最佳方式

  而如果想要提取所有具有指定鍵的節點,可以參考下面的例子:

# 找到所有具有polyline鍵的節點對應的polyline與road鍵對應值
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]')
(資料科學學習手札125)在Python中操縱json資料的最佳方式

2.3 返回結果的形式

  在前面的例子中,我們所有的返回結果直接就是提取到的滿足條件的結果,而jsonpath()中還提供了另一種特殊的結果返回形式,只需要設定引數result_type=None就可以改直接返回結果為返回每個結果的JSONPath表示式:

# 獲取結果的JSONPath表示式
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]', result_type=None)
(資料科學學習手札125)在Python中操縱json資料的最佳方式

  以上介紹的均為jsonpath庫中的常規功能,可以滿足基礎的json資料提取需求,而除了jsonpath之外,還有其他具有更加豐富擴充功能的JSONPath類的第三方庫,可以幫助我們實現很多進階靈活的操作,我們將在下一篇文章中繼續討論。


  以上就是本文的全部內容,歡迎在評論區與我進行討論~

相關文章