本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  在上一期文章中我们一起学习了在Python中如何使用jsonpath库,对JSON格式数据结构进行常规的节点条件查询,可以满足日常许多的数据处理需求。

  而在上一期结尾处,我提到了还有其他JSONPath功能相关的进阶Python库,在今天的文章中,我就将带大家学习更加高级的JSON数据处理方式。

2 基于jsonpath-ng的进阶JSON数据处理方法

  jsonpath-ng是一个功能强大的Python库,它整合了jsonpath-rwjsonpath-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对象的updateupdate_or_create方法即可,使用效果的区别如下所示,轻轻松松就可以完成两种策略下的节点更新操作:

  jsonpath-ng中还有一些丰富的功能,这里就不再赘述,感兴趣的读者朋友可以前往https://github.com/h2non/jsonpath-ng查看。


  以上就是本文的全部内容,欢迎在评论区与我进行讨论~

(数据科学学习手札126)Python中JSON结构数据的高效增删改操作的更多相关文章

  1. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  2. (数据科学学习手札42)folium进阶内容介绍

    一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...

  3. (数据科学学习手札47)基于Python的网络数据采集实战(2)

    一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...

  4. (数据科学学习手札80)用Python编写小工具下载OSM路网数据

    本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...

  5. (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

    一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...

  6. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  7. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

    *从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...

  8. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  9. (数据科学学习手札44)在Keras中训练多层感知机

    一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...

随机推荐

  1. 《MySQL面试小抄》索引考点二面总结

    <MySQL面试小抄>索引考点二面总结 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点 ...

  2. 从零开始学前端,React框架背后的核心机制和原理JSX

    什么是React React是起源于Facebook的一个前端框架,用于构建用户界面的JavaScript库,Facebook用来探索一种更加高效优雅的Javascript MVC框架来架设Insta ...

  3. Netty 框架学习 —— UDP 广播

    UDP 广播 面向连接的传输(如 TCP)管理两个网络端点之间的连接的建立,在连接的生命周期的有序和可靠的消息传输,以及最后,连接的有序终止.相比之下,类似 UDP 的无连接协议中则没有持久化连接的概 ...

  4. webpack(8)vue组件化开发的演变过程

    前言 真实项目开发过程中,我们都是使用组件化的去开发vue的项目,但是组件化的思想又是如何来的呢?下面就从开始讲解演变过程 演变过程1.0 一般情况下vue都是单页面开发,所以项目中只会有一个inde ...

  5. apache 2.2 静态文件目录的配置

    引用 #禁止使用proxy_ajp代理的目录: ProxyPass /sns/images/ ! #使用proxy_ajp代理:下面的配置,是把所有目录全用代理(当然,还会跟上面的禁用配置组合成完整的 ...

  6. 5shell中的数组

    0.理解数组 (1)shell不限制数组的大小,数组元素的下标从0开始计数 (2)获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式,但是下标必须大于等于0 (3)b ...

  7. MySQL中的字段拼接 concat() concat_ws() group_concat()函数

    1.concat()函数 2.concat_ws()函数 3.group_concat()函数 操作的table select * from test_concat order by id limit ...

  8. Spring学习总结(一)---谈谈对Spring IOC的理解(一:理论知识理解)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  9. 记两道最近做的pwn题(ciscn_2019)

    这两题为什么要记录呢,一个是我发现网上很多教程没写清楚(也可能是我太菜了),二是细节点很多,不同的大佬方式不太一样,有很多细节需要注意 ciscn_2019_es_2 这题是栈迁移的题,先上exp 1 ...

  10. python使用笔记28--unittest单元测试框架

    单元测试:开发程序的人自己测试自己的代码 unittest自动化测试框架 1.单元测试 unittest框架,执行的顺序是按照方法名的字母来排序的 setUpClass方法是最开始执行的 tearDo ...