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 相关文章推荐
windows下wxPython开发环境安装与配置方法
Jun 28 Python
python动态参数用法实例分析
May 25 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
Python中join函数简单代码示例
Jan 09 Python
Python装饰器用法示例小结
Feb 11 Python
Python实现ping指定IP的示例
Jun 04 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
python实现门限回归方式
Feb 29 Python
python获取栅格点和面值的实现
Mar 10 Python
django 实现手动存储文件到model的FileField
Mar 30 Python
python字典的元素访问实例详解
Jul 21 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 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 empty函数 使用说明
2009/08/10 PHP
详谈PHP编码转换问题
2015/07/28 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
JavaScript中的事件处理
2008/01/16 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
jquery each的几种常用的使用方法示例
2014/01/21 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
python入门之井字棋小游戏
2020/03/05 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
青年文明号事迹材料
2014/01/18 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
体育活动总结范文
2014/05/04 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
单位计划生育责任书
2015/05/09 职场文书