Python_实现json数据的jsonPath(精简版)定位及增删改操作

简介: Python_实现json数据的jsonPath(精简版)定位及增删改操作

基于python实现json数据的jsonPath(精简版)定位及增删改操作

 

by:授客QQ1033553122

 

 

实践环境

win7 64

Python 3.4.0

 

代码

#-*- encoding:utf-8 -*-

 

# author:授客

 

importre

 

defparse_sub_expr(sub_expr):

   '''

   解析字表达式-元素路径的组成部分

   :param sub_expr:

   :return:

   '''

   RIGHT_INDEX_DEFAULT ='200000000'# 右侧索引的默认值 未指定右侧索引时使用,形如key[2:]key[:]

   result = re.findall('\[.+\]', sub_expr)

   ifresult:# 如果子表达式为数组,形如[1]key[1]key[1:2]key[2:]key[:3]key[:]

       array_part = result[0]

       array_part = array_part.lstrip('[').rstrip(']')

       key_part = sub_expr[:sub_expr.index('[')]

 

       ifkey_part =='$':  # 如果key$,为根,替换为数据变量json_data

           key_part = JSON_DATA_VARNAME

       elifkey_part =='*':

           key_part =='\[.+\]'# 如果key*,替换为\[\.+\]以便匹配["key1"]["key2"]……

       else:

           key_part ='\["%s"\]'% key_part

 

       ifarray_part =='*':# 如果数组索引为*,替换为\[\d+\]以便匹配[0][1]……

           array_part ='\[\d+\]'

       else:

           array_part_list = array_part.replace(' ','').split(':')

           left_index = array_part_list[0:1]

           right_index = array_part_list[1:]

 

           ifleft_index:

               left_index = left_index[0]

               if not(left_indexorleft_index.isdigit()):# 为空字符串、非数字

                   left_index ='0'

           else:

               left_index ='0'

 

           ifright_index:

               right_index = right_index[0]

               if not(right_indexorright_index.isdigit()):

                   right_index = RIGHT_INDEX_DEFAULT# 一个比较大的值,

               array_part = left_index +'-'+ right_index

           else:

               array_part = left_index

 

           array_part ='\[[%s]\]'% array_part  # 数组索引设置为\[[n-m]\],以便匹配[n],[n+1], ……[m-1]

 

       returnkey_part + array_part

   elifsub_expr =='*':

       sub_expr ='\[.+\]'

   elifsub_expr =='$':

       sub_expr = JSON_DATA_VARNAME

   else:

       sub_expr ='\["%s"\]'% sub_expr

 

   returnsub_expr

 

 

defparse_json(json_data, data_struct_link):

   '''

   递归解析json数据结构,存储元素的路径

   :param json_data:

   :param data_struct_link:

   :return:

   '''

   iftype(json_data) ==type({}):# 字典类型

       keys_list = json_data.keys()

 

       forkeyinkeys_list:

           temp_data_struct_link =  data_struct_link +'["%s"]'% key

           iftype(json_data[key])not in[type({}),type([])]:# key对应的value值既不是数组,也不是字典

               data_struct_list.append(temp_data_struct_link)

           else:

               parse_json(json_data[key], temp_data_struct_link)

   eliftype(json_data) ==type([]):# 数组类型

       array_length =len(json_data)

       forindexinrange(0, array_length):

           temp_json_data = json_data[index]

           keys_list = temp_json_data.keys()

 

           forkeyinkeys_list:

               temp_data_struct_link =  data_struct_link +'[%s]["%s"]'% (str(index), key)

               iftype(temp_json_data[key])not in[type({}),type([])]:# key对应的value值既不是数组,也不是字典

                   data_struct_list.append(temp_data_struct_link)

               else:

                   parse_json(temp_json_data[key], temp_data_struct_link)

 

if__name__ =='__main__':

   json_data = [{"data": [{

                              "admin":"string|集群负责人|||",

                              "components": [

                                  {

                                      "clusterId":"integer|组件所属的集群id|||",

                                      "createTime":"string|组件创建时间|||",

                                      "description":"string|组件描述|||",

                                      "enabled":"boolean|组件是否开启||false|",

                                      },

                                  {

                                      "clusterId":"integer|组件所属的集群id|||",

                                      "createTime":"string|组件创建时间|||",

                                      "description":"string|组件描述|||",

                                      "enabled":"boolean|组件是否开启||false|",

 

                                      }

                              ],

                              "createTime":"string|集群创建时间|||",

                              "description":"string|集群描述|||",

                              "enabled":"boolean|集群是否开启||false|",

                              "id":"integer|集群id|||",

                              "modifyTime":"string|集群修改时间|||",

                              "name":"string|集群名|||"

                          }],

                 "errMsg":"string||||",

                 "ok":"boolean||||",

                 "status":"integer||||"

                 }]

 

 

   JSON_DATA_VARNAME ='json_data'# 存在json数据的变量名称

   data_struct_list = []# 用于存放所有json元素路径,形如json_data[0]["data"][0]["components"][0]["enabled"]

   data_struct_link ='json_data'  #  用于临时存放单条json元素路径(的一部分)

   parse_json(json_data, data_struct_link)

 

   print('获取的json元素路径,元素值如下:')

   foritemindata_struct_list:

       print(item,'\t',  eval(item))

 

   # 测试用表达式

   # expr = '$.data[*].components[0]' # json数据为字典 形如{……}

   # expr = '$[*].data[0:1].components[*]'  # json数据为数组 形如[{……}]

   expr ='data[0:1].components[*]'

   # expr = 'data[0:1].components'

 

   # 解析表达式为正则表达式

   re_pattern =''

   forsub_exprinexpr.split('.'):

       re_pattern += parse_sub_expr(sub_expr)

 

 

   print('\n元素路径jsonpath表达式为:%s'% expr)

   print('元素路径正则表达式re pattern为:%s'% re_pattern)

 

   print('\njsonpath 匹配结果如下:')

   re_pattern = re.compile(re_pattern)

 

   target_set =set()# 匹配结果会有重复值,所以采用集合

   foritemindata_struct_list:

       results = re.findall(re_pattern, item)

       forresultinresults:

           print('匹配的元素路径jsonpath为:%s'% item)

           print('正则匹配结果为:%s'% result)

 

           target = item[0:item.index(result) +len(result)]

           print('供提取数据使用的jsonpath为:%s'% target)

           print('提取的结果值为:%s\n'%eval(target))

 

           target_set.add(target)

 

   # 通过匹配提取的目标结果,操作json

   foritemintarget_set:

       target =eval(item)

       iftype(target) ==type({}):#  如果为字典

           # 更改键的值

           target['clusterId'] =10

 

          # 新增键值对

           target['new_key'] ='key_value'

 

           # 更改键的名称,可以考虑先复制旧的键值,赋值给新的键,然后删除旧的键

           target['description_new'] = target['description']

 

           # 删除键值对

           deltarget['description']

 

       eliftype(target) ==type([]):

           # 暂不实现

           pass

 

   print(json_data)

 

运行结果截图:

 

 

目录
相关文章
|
11天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:智能数据隐私保护
使用Python实现深度学习模型:智能数据隐私保护 【10月更文挑战第3天】
40 0
|
9天前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
27 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
9天前
|
计算机视觉 Python
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
这篇文章介绍了如何使用Python的OpenCV库将多张图片合并为一张图片显示,以及如何使用matplotlib库从不同txt文档中读取数据并绘制多条折线图。
31 3
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
|
10天前
|
数据可视化 算法 Python
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
本文介绍了如何利用Python脚本结合动态模态分解(DMD)技术,分析从OpenFOAM模拟中提取的二维切片数据,以深入理解流体动力学现象。通过PyVista库处理VTK格式的模拟数据,进行POD和DMD分析,揭示流场中的主要能量结构及动态特征。此方法为研究复杂流动系统提供了有力工具。
22 2
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
|
6天前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
25 2
|
7天前
|
JSON 安全 数据安全/隐私保护
深度剖析:Python如何运用OAuth与JWT,为数据加上双保险🔐
【10月更文挑战第10天】本文介绍了OAuth 2.0和JSON Web Tokens (JWT) 两种现代Web应用中最流行的认证机制。通过使用Flask-OAuthlib和PyJWT库,详细展示了如何在Python环境中实现这两种认证方式,从而提升系统的安全性和开发效率。OAuth 2.0适用于授权过程,JWT则简化了认证流程,确保每次请求的安全性。结合两者,可以构建出既安全又高效的认证体系。
25 1
|
9天前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
22 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
13天前
|
数据采集 监控 数据可视化
用Python构建动态折线图:实时展示爬取数据的指南
本文介绍了如何利用Python的爬虫技术从“财富吧”获取中国股市的实时数据,并使用动态折线图展示股价变化。文章详细讲解了如何通过设置代理IP和请求头来绕过反爬机制,确保数据稳定获取。通过示例代码展示了如何使用`requests`和`matplotlib`库实现这一过程,最终生成每秒自动更新的动态股价图。这种方法不仅适用于股市分析,还可广泛应用于其他需要实时监控的数据源,帮助用户快速做出决策。
|
数据采集 JSON 安全
|
9天前
|
存储 程序员 开发者
Python编程基础:从入门到实践
【10月更文挑战第8天】在本文中,我们将一起探索Python编程的奇妙世界。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息。我们将从Python的基本概念开始,然后逐步深入到更复杂的主题,如数据结构、函数和类。最后,我们将通过一些实际的代码示例来巩固我们的知识。让我们一起开始这段Python编程之旅吧!