Python中JSON结构数据的高效增删改操作
❝本文示例代码及文件已上传至我的
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