当前位置: 代码网 > it编程>前端脚本>Python > 使用Python和PyQt5打造一个JSON快速查看器

使用Python和PyQt5打造一个JSON快速查看器

2026年01月21日 Python 我要评论
最近写了一个小工具:只要拖入或打开一个 json 文件,输入 key,就能快速查看对应的值。本文以 d:\测试\github项目\59-josn快速查看器\main.py 为例,完整拆解这个 pyqt

最近写了一个小工具:只要拖入或打开一个 json 文件,输入 key,就能快速查看对应的值。本文以 d:\测试\github项目\59-josn快速查看器\main.py 为例,完整拆解这个 pyqt5 小工具的实现思路和关键代码。

一、需求与效果

需求非常简单:

  • 支持从文件拖拽或文件选择框加载 json 文件
  • 输入 key,快速显示对应的值
  • key 支持「点语法」和列表下标:
    • name
    • user.name
    • items.0.id
  • 界面要尽量简洁,美观,适合日常调试 json 时快速使用

最终效果:

  • 顶部标题 + 提示语,说明工具用途和操作方式
  • 中间一行显示当前 json 文件路径 + 打开按钮
  • 一行 key 输入 + 查询按钮
  • 下方大区域显示查询结果(支持格式化 json)
  • 底部状态栏显示操作结果提示(成功 / 失败)

二、项目结构与入口

本工具的主体代码全部在一个文件中:

  • 主文件:main.py
  • 主类:jsonviewer(qmainwindow)
  • 入口函数:main()

入口函数代码:

def main():
    app = qapplication(sys.argv)
    viewer = jsonviewer()
    viewer.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

这是典型的 pyqt5 应用启动方式:

  1. 创建 qapplication 实例
  2. 实例化主窗口 jsonviewer
  3. 显示窗口
  4. 进入事件循环

三、窗口与整体样式设计

1. 主窗口类与基础设置

主窗口继承自 qmainwindow

class jsonviewer(qmainwindow):
    def __init__(self):
        super().__init__()
        self.data = none
        self.current_path = none
        self.init_ui()
  • self.data:用来保存当前加载的 json 对象
  • self.current_path:记录当前 json 文件路径
  • init_ui():负责创建和布局所有控件,并设置样式

2. 设置窗口大小与全局样式

def init_ui(self):
    self.setwindowtitle("json快速查看器")
    self.resize(800, 520)

    self.setstylesheet(
        """
        qwidget {
            background-color: #f5f5f7;
            font-family: "microsoft yahei";
            font-size: 10pt;
        }
        qpushbutton {
            background-color: #0078d7;
            color: white;
            border-radius: 4px;
            padding: 6px 14px;
        }
        qpushbutton:hover {
            background-color: #0a84ff;
        }
        qpushbutton:pressed {
            background-color: #005a9e;
        }
        qlineedit, qtextedit {
            background-color: #ffffff;
            border: 1px solid #d0d0d5;
            border-radius: 4px;
        }
        qlineedit:focus, qtextedit:focus {
            border: 1px solid #0a84ff;
        }
        """
    )

这里用了一段简单的 qt 样式表(类似 css):

  • 全局字体:微软雅黑 10pt
  • 背景色:淡灰色 #f5f5f7
  • 按钮:蓝色背景 + 白字 + 圆角 + 悬停 / 按下态
  • 输入框和文本框:白色背景 + 边框 + 聚焦时高亮

通过一次性设置 qwidget 和各控件的样式,可以避免对每个控件逐个设置属性,代码更简洁,视觉也更统一。

四、布局与控件拆解

1. 主布局与标题区

central_widget = qwidget()
self.setcentralwidget(central_widget)

main_layout = qvboxlayout()
central_widget.setlayout(main_layout)
main_layout.setcontentsmargins(20, 18, 20, 18)
main_layout.setspacing(12)

self.info_label = qlabel("json 快速查看器")
self.info_label.setalignment(qt.aligncenter)
title_font = self.info_label.font()
title_font.setpointsize(14)
title_font.setbold(true)
self.info_label.setfont(title_font)
main_layout.addwidget(self.info_label)

subtitle = qlabel("拖入 json 文件到窗口,或点击右侧按钮选择文件")
subtitle.setalignment(qt.aligncenter)
subtitle.setstylesheet("color: #666666;")
main_layout.addwidget(subtitle)
  • 纵向布局 qvboxlayout:从上到下堆叠各个区域
  • 主标题用 14 号加粗字体,居中显示
  • 副标题用浅灰色,提示使用方法

2. 文件选择行(显示路径 + 打开按钮)

file_layout = qhboxlayout()
self.file_label = qlabel("未选择文件")
self.file_label.setminimumwidth(300)
self.file_label.settextinteractionflags(qt.textselectablebymouse)
self.file_label.setstylesheet("color: #555555;")
open_button = qpushbutton("打开json")
open_button.clicked.connect(self.open_file)
file_layout.addwidget(self.file_label)
file_layout.addwidget(open_button)
main_layout.addlayout(file_layout)

设计要点:

  • 使用水平布局 qhboxlayout,左边是文件路径,右边是按钮
  • 文件路径标签支持鼠标选中,方便复制路径
  • 初始提示为「未选择文件」

3. key 输入行(key + 输入框 + 查询按钮)

key_layout = qhboxlayout()
key_label = qlabel("key:")
key_label.setstylesheet("color: #333333;")
self.key_edit = qlineedit()
self.key_edit.setplaceholdertext("例如: user.name 或 items.0.id")
key_font = self.key_edit.font()
key_font.setpointsize(10)
self.key_edit.setfont(key_font)
search_button = qpushbutton("查询")
search_button.clicked.connect(self.lookup_key)
self.key_edit.returnpressed.connect(self.lookup_key)
key_layout.addwidget(key_label)
key_layout.addwidget(self.key_edit)
key_layout.addwidget(search_button)
main_layout.addlayout(key_layout)

细节设计:

  • 提示语直接告诉用户 key 的写法示例
  • 支持两种触发方式:
    • 点击「查询」按钮
    • 在输入框里按 enter(returnpressed 信号)

4. 结果显示区与状态栏

self.result_edit = qtextedit()
self.result_edit.setreadonly(true)
result_font = self.result_edit.font()
result_font.setfamily("consolas")
result_font.setpointsize(10)
self.result_edit.setfont(result_font)
main_layout.addwidget(self.result_edit)

self.status_label = qlabel("")
self.status_label.setstylesheet("color: #2e7d32;")
main_layout.addwidget(self.status_label)
  • 结果用 qtextedit 展示,适合显示多行 json
  • 使用等宽字体 consolas,方便对齐与阅读
  • 底部 status_label 用来显示提示信息:
    • json 加载成功
    • 未找到对应的值
    • 请先加载 json 文件
      等等

五、拖拽与打开 json 文件

1. 开启拖拽支持

self.setacceptdrops(true)

然后重写两个事件函数:

def dragenterevent(self, event):
    if event.mimedata().hasurls():
        for url in event.mimedata().urls():
            path = url.tolocalfile()
            if path.lower().endswith(".json"):
                event.acceptproposedaction()
                return
    event.ignore()

逻辑:

  • 拖入的内容如果包含文件 url
  • 且其中有 .json 后缀的文件
  • 则接受这次拖拽,否则忽略

真正的放下事件:

def dropevent(self, event):
    for url in event.mimedata().urls():
        path = url.tolocalfile()
        if path.lower().endswith(".json"):
            self.load_json(path)
            break
  • 取第一个 .json 文件的路径
  • 调用 load_json 进行加载

2. 通过文件选择框打开 json

def open_file(self):
    path, _ = qfiledialog.getopenfilename(
        self,
        "选择 json 文件",
        "",
        "json files (*.json);;all files (*)",
    )
    if path:
        self.load_json(path)

使用 qfiledialog.getopenfilename

  • 默认过滤器是 .json 文件
  • 也可以切换为「所有文件」打开

3. 加载 json 文件

def load_json(self, path):
    try:
        with open(path, "r", encoding="utf-8") as f:
            self.data = json.load(f)
        self.current_path = path
        self.file_label.settext(path)
        self.status_label.settext("json 加载成功")
        self.result_edit.clear()
    except exception as e:
        self.data = none
        self.current_path = none
        self.file_label.settext("未选择文件")
        self.status_label.settext("加载失败: {0}".format(e))
        self.result_edit.clear()
  • 成功:
    • json.load 解析为 python 对象(dict / list)
    • 更新当前路径显示
    • 清空结果区域
    • 状态显示为「json 加载成功」
  • 失败:
    • 清空状态
    • 文件标签重置
    • 状态栏显示错误原因

六、key 路径解析与查询逻辑

1. 查询入口函数

def lookup_key(self):
    if self.data is none:
        self.status_label.settext("请先加载 json 文件")
        return

    key_path = self.key_edit.text().strip()
    if not key_path:
        self.status_label.settext("请输入 key")
        return

    try:
        value = self.get_value_by_path(self.data, key_path)
    except (keyerror, indexerror, typeerror):
        self.status_label.settext("未找到对应的值")
        self.result_edit.clear()
        return

    if isinstance(value, (dict, list)):
        text = json.dumps(value, ensure_ascii=false, indent=2)
    else:
        text = str(value)

    self.result_edit.setplaintext(text)
    self.status_label.settext("查询成功")

逻辑分几步:

  1. 检查是否已加载 json
  2. 检查 key 是否为空
  3. 调用 get_value_by_path 获取值,捕获各种失败情况
  4. 如果结果是 dictlist,用 json.dumps 美化输出
  5. 否则直接转成字符串显示

2. 路径解析核心函数

def get_value_by_path(self, data, path):
    if not path:
        return data

    current = data
    parts = path.split(".")

    for part in parts:
        if isinstance(current, list) and part.isdigit():
            index = int(part)
            current = current[index]
        elif isinstance(current, dict):
            if part in current:
                current = current[part]
            else:
                raise keyerror(part)
        else:
            raise keyerror(part)

    return current

这个函数支持的语法:

  • 对象键:
    • user.name 会依次访问 data["user"]["name"]
  • 列表下标:
    • items.0 相当于 data["items"][0]
    • items.0.id 相当于 data["items"][0]["id"]

实现方式:

  1. 把路径按 . 切分为列表 ["items", "0", "id"]
  2. 从根对象开始,逐层向下走
  3. 当前对象是 list 且当前 part 是数字时:
    • 解析成 int 下标,访问对应元素
  4. 当前对象是 dict 时:
    • 直接按照键访问
  5. 如果中途类型不匹配或键不存在,就抛异常,由调用方统一处理为「未找到对应的值」

这个函数逻辑简单清晰,但已经覆盖了绝大部分日常 json 调试的需求。

七、少量代码实现一个高频小工具

整个 main.py 代码量不大,却完成了:

  • 一个小而美的 pyqt5 窗口应用
  • 支持拖拽 / 打开 json 文件
  • 支持 key 路径解析(对象 + 列表)
  • 自适应格式化输出结果
  • 简单但实用的状态提示和 ui 美化

如果需要扩展,这个工具还可以进一步完善:

  • 支持 a[0].b 这种带中括号的路径语法
  • 增加「历史 key」下拉列表,快速重复查询
  • 添加「复制结果」按钮,一键复制查询结果
  • 增加「json 树形视图」,可视化浏览整个结构

八、小结

这篇文章从需求出发,完整拆解了 main.py 中的实现:

  • 如何用 pyqt5 快速搭建一个桌面小工具
  • 如何用样式表和字体调整让界面更友好
  • 如何通过拖拽和文件选择加载 json
  • 如何用简单的「点语法 + 数字下标」解析 json 路径

如果你也经常需要调试接口或查看复杂 json,不妨参考这个实现,按自己的习惯继续扩展,让它成为你日常开发中的一个趁手小工具。

以上就是python使用pyqt5打造一个json快速查看器的详细内容,更多关于pyqt5 json快速查看器的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com