Python中JSON结构数据的高效增删改操作

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

 1 简介

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

[[416269]]

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

[[416270]]

 

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模式,并将其运用到对数据的匹配上,依然以上篇文章的数据为例: 

  1. import json 
  2. from jsonpath_ng import parse 
  3.  
  4. # 读入示例json数据 
  5. with open('json示例.json', encoding='utf-8'as j: 
  6.     demo_json = json.loads(j.read()) 
  7.      
  8. # 构造指定JSONPath模式对应的解析器 
  9. parser = parse('$..paths..steps[*].duration'
  10.  
  11. # 利用解析器的find方法找到目标数据中所有满足条件的节点 
  12. matches = parser.find(demo_json) 
  13.  
  14. # 利用value属性取得对应匹配结果的值 
  15. matches[0].value 

而基于上面产生的一些对象我们就可以实现对JSON数据的增删改:

2.1.1 对JSON数据进行增操作

在jsonpath-ng中对JSON数据添加节点,思想是先构造对「原先不存在」的节点进行匹配的解析器对象,利用find_or_create方法处理原始JSON数据: 

  1. # 构造示例数据 
  2. demo_json = { 
  3.     'level1': [ 
  4.         { 
  5.             'level2': {} 
  6.         }, 
  7.         { 
  8.             'level2': { 
  9.                 'level3': 12 
  10.             } 
  11.         } 
  12.     ] 
  13.  
  14. # 构造规则解释器,所有除去最后一层节点规则外可以匹配到的节点 
  15. # 都属于合法匹配结果,会在匹配结果列表中出现 
  16. parser = parse('level1[*].level2.level3'
  17.  
  18. matches = parser.find_or_create(demo_json) 
  19.  
  20. demo_json 

在find_or_create操作之后,demo_json就被修改成下面的结果: 

 

接下来的事情就很简单了,只需要在matches结果中进行遍历,遇到value属性为{}的,就运用full_path.update_or_create()方法对原始JSON数据进行更新即可,比如这里我们填充999: 

  1. for match in matches: 
  2.     if match.value == {}: 
  3.         # 更新原始输入的JSON数据 
  4.         match.full_path.update_or_create(demo_json, 999) 
  5.  
  6. demo_json 

  

2.1.2 对JSON数据进行删操作

当我们希望对JSON数据中指定JSONPath规则的节点予以删除时,可以使用到parse对象的filter()方法传入lambda函数,在lambda函数中进行条件判断,返回的即为删除指定节点之后的输入数据。

以上一步「增」操作后得到的demo_json为例,我们来对其level1[*].level2.level3值为999的予以过滤: 

  1. parser = parse('level1[*].level2.level3'
  2.  
  3. # 过滤 level1[*].level2.level3 规则下值为 999 的节点 
  4. parser.filter(lambda x: x == 999, demo_json) 
  5. demo_json 

可以看到结果正是我们所预期的: 

 

2.1.3 对JSON数据进行改操作

对JSON数据中的指定节点进行改操作非常的简单,只需要使用parse对象的update或update_or_create方法即可,使用效果的区别如下所示,轻轻松松就可以完成两种策略下的节点更新操作😋: 

 

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

 

责任编辑:华轩 来源: Python大数据分析
相关推荐

2009-11-13 15:54:26

ADO.NET数据库操

2019-11-07 15:39:36

数据库MySQL文章

2016-10-13 19:16:28

Python编程语言mysql

2020-10-29 08:39:45

JSONJava对象

2023-06-08 08:13:43

2023-09-21 16:13:20

Python数据结构

2021-01-18 14:04:49

java监控操作

2010-03-16 16:47:25

Python数组

2012-04-19 10:06:16

ibmdw

2011-09-02 14:18:53

OracleBULK COLLECFORALL

2010-03-03 10:45:09

Python字典

2012-04-12 09:23:15

达梦数据库

2020-12-22 08:41:21

GolangPostgreSQL数据库

2020-07-22 16:40:23

增删改查Java代码

2009-11-12 09:18:40

ASP.NET MVC

2023-11-30 16:05:17

2023-02-27 07:37:56

Curl操作SQL

2015-05-20 12:50:42

C#开发抽象增删改

2010-04-19 17:56:54

Unix操作系统

2023-01-05 16:36:55

点赞
收藏

51CTO技术栈公众号