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函数的笔记整理
Apr 07 Python
Python简单计算文件夹大小的方法
Jul 14 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
NetworkX之Prim算法(实例讲解)
Dec 22 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
Django项目中使用JWT的实现代码
Nov 04 Python
python__new__内置静态方法使用解析
Jan 07 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
pytorch 计算ConvTranspose1d输出特征大小方式
Jun 23 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
Pycharm的Available Packages为空的解决方法
Sep 18 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 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不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
Python中的多重装饰器
2015/04/11 Python
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python实现微信小程序支付功能
2019/07/25 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
文秘专业自荐信
2013/10/14 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
团日活动总结书格式
2014/05/08 职场文书
七一建党节演讲稿
2014/09/11 职场文书
大学生赌博检讨书
2014/09/22 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
开除通知书范本
2015/04/25 职场文书
离职证明格式样本
2015/06/12 职场文书
化工生产实习心得体会
2016/01/22 职场文书
mysql优化
2021/04/06 MySQL
Python编程编写完善的命令行工具
2021/09/15 Python
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫