当前位置: 首页 > 科技观察

Python高效增删改查JSON结构数据

时间:2023-03-16 15:05:07 科技观察

1简介上一篇我们学习了如何使用Python中的jsonpath库对JSON格式数据结构进行正则节点条件查询,可以满足很多日常任务。数据处理需求。在上一期的最后,我提到还有其他与JSONPath函数相关的高级Python库。在今天的文章中,我将带大家学习更高级的JSON数据处理方法。2基于jsonpath-ng的高级JSON数据处理方法jsonpath-ng是一个强大的Python库,它集成了jsonpath-rw、jsonpath-rw-ext等第三方JSONPath扩展库的实用功能,方便我们语法、实现更多操作JSON数据的功能,而不仅仅是查询数据,使用pipinstalljsonpath-ng安装:2.1JSON数据的增删改查jsonpath-ng中设计了一些方法,可以帮助我们实现现有的JSON对于数据的增删改查操作,首先我们来学习一下如何在jsonpath-ng中定义JSONPath模式,并将其应用到数据匹配中。还是以上一篇文章中的数据为例:importjsonfromjsonpath_ngimportparse#Readinsamplejsondatawithopen('jsonExample.json',encoding='utf-8')asj: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数据:#Constructsampledatademo_json={'level1':[{'level2':{}},{'level2':{'level3':12}}]}#构造规则解释所有可以m的节点atched除最后一层节点规则外都是合法的匹配结果,都会出现在匹配结果列表中。parser=parse('level1[*].level2.level3')matches=parser.find_or_create(demo_json)demo_json在find_or_create操作后修改为如下Result:接下来的事情就很简单了,只需要遍历matches结果,遇到value属性为{}的时候,就可以使用full_path.update_or_create()方法更新原来的JSON数据,比如我们这里Fill999:formatchinmatches:ifmatch.value=={}:#updatetheoriginalinputJSONdatamatch.full_path.update_or_create(demo_json,999)demo_json2.1.2对JSON数据的删除操作当我们要在JSON数据中指定JSONPath规则时删除节点,可以使用parse对象的filter()方法传入lambda函数,在lambda函数中进行条件判断,返回的是删除指定节点后的输入数据。前面“自增”操作后得到的demo_json为例如我们过滤level1[*].level2.level3的值为999:parser=parse('level1[*].level2.level3')#过滤下的值level1[*].level2.level3999nodeparser.filter(lambdax:x==999,demo_json)demo_json的规则可以看到结果正是我们预期的:2.1.3修改JSON数据很简单修改JSON数据中的指定节点,只需要使用parse对象的update或者update_or_create方法即可。效果区别如下,两种策略下都可以轻松完成节点更新操作😋:jsonpath-ng函数中有一些丰富的方法,这里不再赘述,有兴趣的读者可以去https://github.com/h2non/jsonpath-ng查看。