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中实现对list做减法操作介绍
Jan 09 Python
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
python3实现读取chrome浏览器cookie
Jun 19 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
解决django model修改添加字段报错的问题
Nov 18 Python
python3 配置logging日志类的操作
Apr 08 Python
python Socket网络编程实现C/S模式和P2P
Jun 22 Python
python中关于数据类型的学习笔记
Jul 19 Python
Python Request类源码实现方法及原理解析
Aug 17 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 Python
在Django中使用MQTT的方法
May 10 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
javascript下function声明一些小结
2007/12/28 Javascript
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
详谈js模块化规范
2017/07/07 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
[00:57]深扒TI7聊天轮盘语音出处5
2017/05/11 DOTA
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
使用python编写批量卸载手机中安装的android应用脚本
2014/07/21 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
python解决字符串倒序输出的问题
2018/06/25 Python
Python实现随机漫步功能
2018/07/09 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
python 装饰器的基本使用
2021/01/13 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
python绘图模块之利用turtle画图
2021/02/12 Python
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
党员创先争优活动总结
2014/05/04 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书