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

上一篇 / 下一篇  2021-08-11 13:12:57

  基于jsonpath-ng的进阶JSON数据处理方法
  jsonpath-ng是一个功能强大的Python库,它整合了jsonpath-rw、jsonpath-rw-ext等第三方JSONPath拓展库的实用功能,使得我们可以基于JSONPath语法,实现更多操纵JSON数据的功能,而不只是查询数据而已,使用pip install jsonpath-ng进行安装:
  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数据的增删改:
  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、对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 
  可以看到结果正是我们所预期的:
  3、对JSON数据进行改操作
  对JSON数据中的指定节点进行改操作非常的简单,只需要使用parse对象的update或update_or_create方法即可,使用效果的区别如下所示,轻轻松松就可以完成两种策略下的节点更新操作:
  jsonpath-ng中还有一些丰富的功能,这里就不再赘述,感兴趣的读者朋友可以前往https://github.com/h2non/jsonpath-ng查看。

TAG: 软件开发 Python

 

评分:0

我来说两句

日历

« 2021-10-09  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 31819
  • 日志数: 236
  • 建立时间: 2020-08-11
  • 更新时间: 2021-10-08

RSS订阅

Open Toolbar