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)

 

运行结果截图:

 

 

目录
相关文章
|
18天前
|
数据采集 Web App开发 数据可视化
Python零基础爬取东方财富网股票行情数据指南
东方财富网数据稳定、反爬宽松,适合爬虫入门。本文详解使用Python抓取股票行情数据,涵盖请求发送、HTML解析、动态加载处理、代理IP切换及数据可视化,助你快速掌握金融数据爬取技能。
308 1
|
19天前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
218 0
|
8天前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
92 4
|
11天前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
20天前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
28天前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
6天前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
51 0
|
1月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
1月前
|
数据采集 数据可视化 关系型数据库
基于python大数据的电影数据可视化分析系统
电影分析与可视化平台顺应电影产业数字化趋势,整合大数据处理、人工智能与Web技术,实现电影数据的采集、分析与可视化展示。平台支持票房、评分、观众行为等多维度分析,助力行业洞察与决策,同时提供互动界面,增强观众对电影文化的理解。技术上依托Python、MySQL、Flask、HTML等构建,融合数据采集与AI分析,提升电影行业的数据应用能力。
|
1月前
|
数据可视化 大数据 数据挖掘
基于python大数据的招聘数据可视化分析系统
本系统基于Python开发,整合多渠道招聘数据,利用数据分析与可视化技术,助力企业高效决策。核心功能包括数据采集、智能分析、可视化展示及权限管理,提升招聘效率与人才管理水平,推动人力资源管理数字化转型。

热门文章

最新文章

推荐镜像

更多