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 06 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
python程序变成软件的实操方法
Jun 24 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
Python3标准库之functools管理函数的工具详解
Feb 27 Python
python Plotly绘图工具的简单使用
Mar 03 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 Python
python如何保存文本文件
Jun 07 Python
python 下划线的不同用法
Oct 24 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 Python
PyQt5实现多张图片显示并滚动
Jun 11 Python
一篇文章弄懂Python中的内建函数
Aug 07 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 cache类代码(php数据缓存类)
2010/04/15 PHP
PHP运行模式的深入理解
2013/06/03 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
javascript实现信息增删改查的方法
2015/07/25 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
2017/09/28 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
python生成器用法实例详解
2019/11/22 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
python如何随机生成高强度密码
2020/08/19 Python
python中使用np.delete()的实例方法
2021/02/01 Python
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
一道写SQL的面试题和答案
2013/11/19 面试题
员工试用期自我鉴定范文
2014/09/15 职场文书
2014年国庆节寄语
2014/09/19 职场文书
飞屋环游记观后感
2015/06/08 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技