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

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查看。

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

---------End---------

回复关键词,获取对应的资料:

关键词资料名称
600《Python知识手册》
md《Markdown速查表》
time《Python时间使用指南》
str《Python字符串速查表》
pip《Python:Pip速查表》
style《Pandas表格样式配置指南》
mat《Matplotlib入门100个案例》
px《Plotly Express可视化指南》
python自带了处理python的模块,使用时候直接import json即可。 使用loads方法即可将json字符串转换成python对象,对应关系如下: JSON     Python object   dict array    list string   unicode number   (int) int, long number   (real) float true     True false    False null     None 但在使用json模块的时候需要注意的是对文的处理,loads方法如果传入的字符串的编码不是UTF-8的话,需要用e d.update({'three': 3, 'four':4}) d.update({'one': 2, 'two': 2}) with open('param.json', 'r+') as file: p = json.load(file) #key= 'one' #del p(key) //这里 jsonpath-ng可以利用jsonpath语法操纵json数据。这里首先是利用type这个key查找数据,利用type的值来过滤出学生,然后获取match.full_path,并在此基础上构建一个在原json“不存在”的path,最后用update_or_create来根据path更新对应json数据,以达到添加key的效果。在一个json结构数据,按要求添加key和值。 with open("C:\\Users\\12804\\Desktop\\example.json", 'w+', encoding="utf-8") as f: # 覆盖写入。del full_data[i]["Affected Resources"] # 删除字典指定键值对 并将新的字典覆盖原来的json内容。full_data = json.load(f) # 取出json所有数据放入字典。 有时候我们需要对json结构数据进行更新,或增,或,或删。 当json层级比较复杂时操作起来是比较麻烦的,得一层层找下去找到要更新的节点才能操作它。 我用python语言封装了一个类,提供三个函数分别用于增删json的目标节点。 首先我们先确定什么是路径(path); 如json: dataA={“code”: 0, “data”: {“areaCode”: “86”, “avatar”: ... 本文主要记录 PredicateContext 和 Filter的用法 其 PredicateContext 是用来删除替换。 Filter是用来过滤,具体用法参考文代码入门请参照:http://www.ibloger.net/article/2329.html项目有一串json如下{   "msg":"success",   "paginationFlrs":"[[2141,2142... 需求:读取本地的json 文件,并修改制定的键的值,本文主要写{'resType':'rest'} 成{'resType':'rect'} 本函数需要给定读取文件的路径以及保存的文件的路径,直接上代码。有问题请留言 # import module import os import json def rest_rect(file_old,file_new): filen... I am using python to delete and update a JSON file generated from the data provided by user, so that only few items should be stored in the database. I want to delete a particular object from the JSON... 最近做的工作用到了python读取与修改json文件,在处理json文件时将对象看做字典 将数组看做列表,json就是对象嵌套列表再嵌套对象的一个可递归的数据结构,处理起来比较麻烦,最初头疼,头疼了一会就想辙了,最终当然是想出辙来了,于是有了这篇文章。 总共的步骤有3步: 1 .读取json文件 ,将文件内容变为字典 2.在字典找到特定的值并且修改该位置 3 将修改后的字典写入之前的json文件 最重要而且最复杂的要数第2步 其用到的知识点是:嵌套类型的数据 也可以通过索引进行修改