簡介
在上一期文章中我們一起學習了在Python中如何使用jsonpath庫,對JSON格式數據結構進行常規的節點條件查詢,可以滿足日常許多的數據處理需求。
而在上一期結尾處,我提到了還有其他JSONPath功能相關的進階Python庫,在今天的文章中,我就將帶大家學習更加高級的JSON數據處理方式。
基于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查看。
【編輯推薦】https://mp.weixin.qq.com/s?__biz=MzA3ODYwNDkzOQ==&mid=2659066521&idx=1&sn=9b9e75d943dfcff2b230a0c80fd315cc&chksm=84cabd7db3bd346b0f1a9a2c1de92e9a9e050cba14184ec716bad39c5c9f8f6b225514e1cc60&mpshare=1&