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
对象的update
或update_or_create
方法即可,使用效果的区别如下所示,轻轻松松就可以完成两种策略下的节点更新操作????:
jsonpath-ng
中还有一些丰富的功能,这里就不再赘述,感兴趣的读者朋友可以前往https://github.com/h2non/jsonpath-ng
查看。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
---------End---------
回复关键词,获取对应的资料:
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步
其中用到的知识点是:嵌套类型的数据 也可以通过索引进行修改: