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 相关文章推荐
用yum安装MySQLdb模块的步骤方法
Dec 15 Python
windows系统下Python环境的搭建(Aptana Studio)
Mar 06 Python
python实现一个简单的并查集的示例代码
Mar 19 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
opencv与numpy的图像基本操作
Mar 08 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
Dec 03 Python
python实现简单飞行棋
Feb 06 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
python基于tkinter实现gif录屏功能
May 19 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利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
Javascript Select操作大集合
2009/05/26 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
简单实现js拖拽效果
2017/07/25 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
Vue实现简易计算器
2020/02/25 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
Python实现通讯录功能
2018/02/22 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
Python 音频生成器的实现示例
2019/12/24 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
Linux文件操作命令都有哪些
2016/07/23 面试题
银行工作检查书范文
2014/01/31 职场文书
学生周末长期请假条
2014/02/15 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
企业年会主持词
2014/03/27 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
市级文明单位申报材料
2014/05/07 职场文书
爱护公共设施标语
2014/06/24 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS