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)

 

运行结果截图:

 

 

目录
相关文章
|
23天前
|
缓存 API 网络架构
淘宝item_search_similar - 搜索相似的商品API接口,用python返回数据
淘宝联盟开放平台中,可通过“物料优选接口”(taobao.tbk.dg.optimus.material)实现“搜索相似商品”功能。该接口支持根据商品 ID 获取相似推荐商品,并返回商品信息、价格、优惠等数据,适用于商品推荐、比价等场景。本文提供基于 Python 的实现示例,包含接口调用、数据解析及结果展示。使用时需配置淘宝联盟的 appkey、appsecret 和 adzone_id,并注意接口调用频率限制和使用规范。
|
2月前
|
存储 Web App开发 前端开发
Python + Requests库爬取动态Ajax分页数据
Python + Requests库爬取动态Ajax分页数据
|
25天前
|
JSON 安全 API
Python处理JSON数据的最佳实践:从基础到进阶的实用指南
JSON作为数据交换通用格式,广泛应用于Web开发与API交互。本文详解Python处理JSON的10个关键实践,涵盖序列化、复杂结构处理、性能优化与安全编程,助开发者高效应对各类JSON数据挑战。
111 1
|
2月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
2月前
|
JSON 数据挖掘 API
闲鱼商品列表API响应数据python解析
闲鱼商品列表API(Goodfish.item_list)提供标准化数据接口,支持GET请求,返回商品标题、价格、图片、卖家信息等。适用于电商比价、数据分析,支持多语言调用,附Python示例代码,便于开发者快速集成。
|
2月前
|
JSON 自然语言处理 API
闲鱼商品详情API响应数据python解析
闲鱼商品详情API(goodfish.item_get)通过商品ID获取标题、价格、描述、图片等信息,支持Python等多语言调用。本文提供Python请求示例,包含请求构造与数据处理方法。
|
2月前
|
JSON API 数据格式
微店商品列表API响应数据python解析
微店商品列表API为开发者提供稳定高效获取商品信息的途径,支持HTTP GET/POST请求,返回JSON格式数据,含商品ID、名称、价格、库存等字段,适用于电商数据分析与展示平台搭建等场景。本文提供Python调用示例,助您快速上手。
|
25天前
|
JSON API 数据格式
淘宝/天猫图片搜索API接口,json返回数据。
淘宝/天猫平台虽未开放直接的图片搜索API,但可通过阿里妈妈淘宝联盟或天猫开放平台接口实现类似功能。本文提供基于淘宝联盟的图片关联商品搜索Curl示例及JSON响应说明,适用于已获权限的开发者。如需更高精度搜索,可选用阿里云视觉智能API。
|
23天前
|
JSON API 数据安全/隐私保护
深度分析淘宝卖家订单详情API接口,用json返回数据
淘宝卖家订单详情API(taobao.trade.fullinfo.get)是淘宝开放平台提供的重要接口,用于获取单个订单的完整信息,包括订单状态、买家信息、商品明细、支付与物流信息等,支撑订单管理、ERP对接及售后处理。需通过appkey、appsecret和session认证,并遵守调用频率与数据权限限制。本文详解其使用方法并附Python调用示例。
|
1月前
|
JSON 缓存 API
淘宝店铺所有商品API,json数据返回
淘宝店铺所有商品API的JSON数据返回通常包含商品的基本信息、动态数据以及分页信息等。以下是一个详细的JSON数据返回示例,以及相关字段的说明

推荐镜像

更多