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)

 

运行结果截图:

 

 

目录
相关文章
|
9天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
19 1
|
10天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
11天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
14天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
23天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
51 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
8天前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
9天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
19 0
|
2月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
46 1
|
25天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
29天前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
在Java中处理JSON数据:Jackson与Gson库比较