(数据科学学习手札126)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

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
查看。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
作者:Feffery
出处:https://www.cnblogs.com/feffery/p/15115785.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!