前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(数据科学学习手札126)Python中JSON结构数据的高效增删改操作

(数据科学学习手札126)Python中JSON结构数据的高效增删改操作

作者头像
Feffery
发布2021-08-10 10:28:11
7390
发布2021-08-10 10:28:11
举报

本文示例代码及文件已上传至我的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模式,并将其运用到对数据的匹配上,依然以上篇文章的数据为例:

代码语言:javascript
复制
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数据:

代码语言:javascript
复制
# 构造示例数据
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:

代码语言:javascript
复制
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的予以过滤:

代码语言:javascript
复制
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查看。


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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-08-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 简介
  • 2 基于jsonpath-ng的进阶JSON数据处理方法
    • 2.1 JSON数据的增删改
      • 2.1.1 对JSON数据进行增操作
      • 2.1.2 对JSON数据进行删操作
      • 2.1.3 对JSON数据进行改操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档