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写的windows服务不能启动的问题
Apr 15 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 Python
Python os模块学习笔记
Jun 21 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
python对DICOM图像的读取方法详解
Jul 17 Python
python:接口间数据传递与调用方法
Dec 17 Python
详解python数据结构和算法
Apr 18 Python
如何为Python终端提供持久性历史记录
Sep 03 Python
Django1.11配合uni-app发起微信支付的实现
Oct 12 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
pycharm 2020 1.1的安装流程
Sep 29 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网页后退不再出现过期
2007/03/08 PHP
PHP n个不重复的随机数生成代码
2009/06/23 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
React Router基础使用
2017/01/17 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
angular多语言配置详解
2019/05/16 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
Python实现配置文件备份的方法
2015/07/30 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python中字典和集合学习小结
2017/07/07 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
医院检讨书范文
2014/02/01 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
团队激励口号
2014/06/06 职场文书
营销与策划专业求职信
2014/06/20 职场文书
少先队活动总结
2014/08/29 职场文书
殡葬服务心得体会
2014/09/11 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
小学优秀班主任材料
2014/12/17 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
大学军训心得体会800字
2016/01/11 职场文书