本文示例程式碼及檔案已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
在上一期文章中我們一起學習了在Python
中如何使用jsonpath
庫,對JSON
格式資料結構進行常規的節點條件查詢,可以滿足日常許多的資料處理需求。
而在上一期結尾處,我提到了還有其他JSONPath
功能相關的進階Python
庫,在今天的文章中,我就將帶大家學習更加高階的JSON
資料處理方式。
2 基於jsonpath-ng的進階JSON資料處理方法
jsonpath-ng
是一個功能強大的Python
庫,它整合了jsonpath-rw
、jsonpath-rw-ext
等第三方JSONPath
擴充庫的實用功能,使得我們可以基於JSONPath
語法,實現更多操縱JSON
資料的功能,而不只是查詢資料而已,使用pip install jsonpath-ng
進行安裝:
2.1 JSON資料的增刪改
jsonpath-ng
中設計了一些方法,可以幫助我們實現對現有JSON
資料的增刪改操作,首先我們來學習jsonpath-ng
中如何定義JSONPath
模式,並將其運用到對資料的匹配上,依然以上篇文章的資料為例:
import json
from jsonpath_ng import parse
# 讀入示例json資料
with open('json示例.json', encoding='utf-8') as j:
demo_json = json.loads(j.read())
# 構造指定JSONPath模式對應的解析器
parser = parse('$..paths..steps[*].duration')
# 利用解析器的find方法找到目標資料中所有滿足條件的節點
matches = parser.find(demo_json)
# 利用value屬性取得對應匹配結果的值
matches[0].value
而基於上面產生的一些物件我們就可以實現對JSON
資料的增刪改:
2.1.1 對JSON資料進行增操作
在jsonpath-ng
中對JSON
資料新增節點,思想是先構造對原先不存在的節點進行匹配的解析器物件,利用find_or_create
方法處理原始JSON
資料:
# 構造示例資料
demo_json = {
'level1': [
{
'level2': {}
},
{
'level2': {
'level3': 12
}
}
]
}
# 構造規則直譯器,所有除去最後一層節點規則外可以匹配到的節點
# 都屬於合法匹配結果,會在匹配結果列表中出現
parser = parse('level1[*].level2.level3')
matches = parser.find_or_create(demo_json)
demo_json
在find_or_create
操作之後,demo_json
就被修改成下面的結果:
接下來的事情就很簡單了,只需要在matches
結果中進行遍歷,遇到value
屬性為{}
的,就運用full_path.update_or_create()
方法對原始JSON
資料進行更新即可,比如這裡我們填充999:
for match in matches:
if match.value == {}:
# 更新原始輸入的JSON資料
match.full_path.update_or_create(demo_json, 999)
demo_json
2.1.2 對JSON資料進行刪操作
當我們希望對JSON
資料中指定JSONPath
規則的節點予以刪除時,可以使用到parse
物件的filter()
方法傳入lambda
函式,在lambda
函式中進行條件判斷,返回的即為刪除指定節點之後的輸入資料。
以上一步增操作後得到的demo_json
為例,我們來對其level1[*].level2.level3
值為999的予以過濾:
parser = parse('level1[*].level2.level3')
# 過濾 level1[*].level2.level3 規則下值為 999 的節點
parser.filter(lambda x: x == 999, demo_json)
demo_json
可以看到結果正是我們所預期的:
2.1.3 對JSON資料進行改操作
對JSON
資料中的指定節點進行改操作非常的簡單,只需要使用parse
物件的update
或update_or_create
方法即可,使用效果的區別如下所示,輕輕鬆鬆就可以完成兩種策略下的節點更新操作?:
jsonpath-ng
中還有一些豐富的功能,這裡就不再贅述,感興趣的讀者朋友可以前往https://github.com/h2non/jsonpath-ng
檢視。
以上就是本文的全部內容,歡迎在評論區與我進行討論~