Python查找不限层级Json数据中某个key或者value的路径方式


Posted in Python onFebruary 27, 2020

最近项目中有一个小需求,查找json文件中某个key或者value的路径,所以就写了一个简单的小脚本,比较粗糙。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
@author: funcups
'''
from logzero import logger
import ast
 
class HandleJson():
  def __init__(self, data):
    if data == None:
      logger.error('请输入json格式数据')
      exit()
 
    if isinstance(data, str):
      try:
        self.data = ast.literal_eval(data)
      except:
        logger.error('请输入正确的json格式数据')
        exit()
    elif isinstance(data, dict):
      self.data = data
 
  def __paths(self, data, path=''):
    '''
    用于遍历json树
    :param data: 原始数据,或者key对应的value值
    :param path: key值字符串,默认值为''
    :return:
    '''
    if isinstance(data, dict):
      for k, v in data.items():
        tmp = path + "['%s']" % k
        yield (tmp, v)
        yield from self.__paths(v, tmp)
 
    if isinstance(data, list):
      for k, v in enumerate(data):
        tmp = path + '[%d]' % k
        yield (tmp, v)
        yield from self.__paths(v, tmp)
 
  def find_key_path(self, key):
    '''
    查找key路径
    :param key: 需要查找路径的key值
    :return: 包含key值路径的list
    '''
    result = []
    for path,value in self.__paths(self.data):
      if path.endswith("['%s']" % key):
        result.append(path)
    with open('path.txt', 'w+', encoding='utf-8') as f:
      list(map(lambda line: f.write(line + '\r'), result))
    return result
 
  def find_value_path(self, key):
    '''
    查找某个值的路径
    :param key: 需要查找的值,限制为字符串,数字,浮点数,布尔值
    :return:
    '''
    result = []
    for path, value in self.__paths(self.data):
      if isinstance(value, (str, int, bool, float)):
        if value == key:
          result.append(path)
    with open('path.txt', 'w+', encoding='utf-8') as f:
      list(map(lambda line: f.write(line + '\r'), result))
    return result
 
if __name__ == '__main__':
  data = {'name': 'funcups'}
  hj = HandleJson(data)
  res = hj.find_key_path('name')
  print(res)
 
  res = hj.find_value_path('funcups')
  print(res)

补充拓展:python 获取的json字符串取值

获取到的json字符串,然后对其取值

{u'result': {u'10.10.10.100': {u'status': u'OK', u'msg': u"{'listen': {'': set([]), '25': set([]),
'22': set(['10.9.19.148', '10.10.10.1', '10.10.10.130'])}}"}}}

data = result.get('result').get(ip[0]).get('msg')

取值得到的是unicode字符串

转换为字典 可用eval()函数

data = eval(result.get('result').get(ip[0]).get('msg'))

data = data.get('listen')

以上这篇Python查找不限层级Json数据中某个key或者value的路径方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用logging模块代替print(logging简明指南)
Jul 09 Python
Python中属性和描述符的正确使用
Aug 23 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
Jan 09 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
解决Django的request.POST获取不到内容的问题
May 28 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
PyQt5多线程刷新界面防假死示例
Dec 13 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
Python configparser模块应用过程解析
Aug 14 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 #Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 #Python
Python 格式化打印json数据方法(展开状态)
Feb 27 #Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 #Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 #Python
python json 递归打印所有json子节点信息的例子
Feb 27 #Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 #Python
You might like
PHP面试题之文件目录操作
2015/10/15 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
使用SAE部署Python运行环境的教程
2015/05/05 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
Fabric 应用案例
2016/08/28 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
Django 路由控制的实现代码
2018/11/08 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
python实现弹窗祝福效果
2019/04/07 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
轻化专业学生实习自我鉴定
2013/09/20 职场文书
开展警示教育活动总结
2015/05/09 职场文书
答辩状格式范本
2015/05/22 职场文书
2015年暑假工作总结
2015/07/13 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js