最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python和PyQt5打造一個(gè)JSON快速查看器

 更新時(shí)間:2026年01月21日 08:48:05   作者:小莊-Python辦公  
本文介紹了如何使用PyQt5創(chuàng)建一個(gè)簡(jiǎn)單的JSON文件查看工具,支持從文件拖拽或打開文件加載JSON數(shù)據(jù),并通過輸入KEY路徑快速查看對(duì)應(yīng)的值,工具界面簡(jiǎn)潔美觀,適合日常調(diào)試JSON數(shù)據(jù),需要的朋友可以參考下

最近寫了一個(gè)小工具:只要拖入或打開一個(gè) JSON 文件,輸入 KEY,就能快速查看對(duì)應(yīng)的值。本文以 d:\測(cè)試\Github項(xiàng)目\59-JOSN快速查看器\main.py 為例,完整拆解這個(gè) PyQt5 小工具的實(shí)現(xiàn)思路和關(guān)鍵代碼。

一、需求與效果

需求非常簡(jiǎn)單:

  • 支持從文件拖拽或文件選擇框加載 JSON 文件
  • 輸入 KEY,快速顯示對(duì)應(yīng)的值
  • KEY 支持「點(diǎn)語法」和列表下標(biāo):
    • name
    • user.name
    • items.0.id
  • 界面要盡量簡(jiǎn)潔,美觀,適合日常調(diào)試 JSON 時(shí)快速使用

最終效果:

  • 頂部標(biāo)題 + 提示語,說明工具用途和操作方式
  • 中間一行顯示當(dāng)前 JSON 文件路徑 + 打開按鈕
  • 一行 KEY 輸入 + 查詢按鈕
  • 下方大區(qū)域顯示查詢結(jié)果(支持格式化 JSON)
  • 底部狀態(tài)欄顯示操作結(jié)果提示(成功 / 失?。?/li>

二、項(xiàng)目結(jié)構(gòu)與入口

本工具的主體代碼全部在一個(gè)文件中:

  • 主文件:main.py
  • 主類:JsonViewer(QMainWindow)
  • 入口函數(shù):main()

入口函數(shù)代碼:

def main():
    app = QApplication(sys.argv)
    viewer = JsonViewer()
    viewer.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

這是典型的 PyQt5 應(yīng)用啟動(dòng)方式:

  1. 創(chuàng)建 QApplication 實(shí)例
  2. 實(shí)例化主窗口 JsonViewer
  3. 顯示窗口
  4. 進(jìn)入事件循環(huán)

三、窗口與整體樣式設(shè)計(jì)

1. 主窗口類與基礎(chǔ)設(shè)置

主窗口繼承自 QMainWindow

class JsonViewer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.data = None
        self.current_path = None
        self.init_ui()
  • self.data:用來保存當(dāng)前加載的 JSON 對(duì)象
  • self.current_path:記錄當(dāng)前 JSON 文件路徑
  • init_ui():負(fù)責(zé)創(chuàng)建和布局所有控件,并設(shè)置樣式

2. 設(shè)置窗口大小與全局樣式

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;
        }
        """
    )

這里用了一段簡(jiǎn)單的 Qt 樣式表(類似 CSS):

  • 全局字體:微軟雅黑 10pt
  • 背景色:淡灰色 #f5f5f7
  • 按鈕:藍(lán)色背景 + 白字 + 圓角 + 懸停 / 按下態(tài)
  • 輸入框和文本框:白色背景 + 邊框 + 聚焦時(shí)高亮

通過一次性設(shè)置 QWidget 和各控件的樣式,可以避免對(duì)每個(gè)控件逐個(gè)設(shè)置屬性,代碼更簡(jiǎn)潔,視覺也更統(tǒng)一。

四、布局與控件拆解

1. 主布局與標(biāo)題區(qū)

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 文件到窗口,或點(diǎn)擊右側(cè)按鈕選擇文件")
subtitle.setAlignment(Qt.AlignCenter)
subtitle.setStyleSheet("color: #666666;")
main_layout.addWidget(subtitle)
  • 縱向布局 QVBoxLayout:從上到下堆疊各個(gè)區(qū)域
  • 主標(biāo)題用 14 號(hào)加粗字體,居中顯示
  • 副標(biāo)題用淺灰色,提示使用方法

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)

設(shè)計(jì)要點(diǎn):

  • 使用水平布局 QHBoxLayout,左邊是文件路徑,右邊是按鈕
  • 文件路徑標(biāo)簽支持鼠標(biāo)選中,方便復(fù)制路徑
  • 初始提示為「未選擇文件」

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)

細(xì)節(jié)設(shè)計(jì):

  • 提示語直接告訴用戶 KEY 的寫法示例
  • 支持兩種觸發(fā)方式:
    • 點(diǎn)擊「查詢」按鈕
    • 在輸入框里按 Enter(returnPressed 信號(hào))

4. 結(jié)果顯示區(qū)與狀態(tài)欄

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)
  • 結(jié)果用 QTextEdit 展示,適合顯示多行 JSON
  • 使用等寬字體 Consolas,方便對(duì)齊與閱讀
  • 底部 status_label 用來顯示提示信息:
    • JSON 加載成功
    • 未找到對(duì)應(yīng)的值
    • 請(qǐng)先加載 JSON 文件
      等等

五、拖拽與打開 JSON 文件

1. 開啟拖拽支持

self.setAcceptDrops(True)

然后重寫兩個(gè)事件函數(shù):

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()

邏輯:

  • 拖入的內(nèi)容如果包含文件 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
  • 取第一個(gè) .json 文件的路徑
  • 調(diào)用 load_json 進(jìn)行加載

2. 通過文件選擇框打開 JSON

def open_file(self):
    path, _ = QFileDialog.getOpenFileName(
        self,
        "選擇 JSON 文件",
        "",
        "JSON Files (*.json);;All Files (*)",
    )
    if path:
        self.load_json(path)

使用 QFileDialog.getOpenFileName

  • 默認(rèn)過濾器是 .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 對(duì)象(dict / list)
    • 更新當(dāng)前路徑顯示
    • 清空結(jié)果區(qū)域
    • 狀態(tài)顯示為「JSON 加載成功」
  • 失?。?ul>
  • 清空狀態(tài)
  • 文件標(biāo)簽重置
  • 狀態(tài)欄顯示錯(cuò)誤原因

六、KEY 路徑解析與查詢邏輯

1. 查詢?nèi)肟诤瘮?shù)

def lookup_key(self):
    if self.data is None:
        self.status_label.setText("請(qǐng)先加載 JSON 文件")
        return

    key_path = self.key_edit.text().strip()
    if not key_path:
        self.status_label.setText("請(qǐng)輸入 KEY")
        return

    try:
        value = self.get_value_by_path(self.data, key_path)
    except (KeyError, IndexError, TypeError):
        self.status_label.setText("未找到對(duì)應(yīng)的值")
        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. 調(diào)用 get_value_by_path 獲取值,捕獲各種失敗情況
  4. 如果結(jié)果是 dictlist,用 json.dumps 美化輸出
  5. 否則直接轉(zhuǎn)成字符串顯示

2. 路徑解析核心函數(shù)

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

這個(gè)函數(shù)支持的語法:

  • 對(duì)象鍵:
    • user.name 會(huì)依次訪問 data["user"]["name"]
  • 列表下標(biāo):
    • items.0 相當(dāng)于 data["items"][0]
    • items.0.id 相當(dāng)于 data["items"][0]["id"]

實(shí)現(xiàn)方式:

  1. 把路徑按 . 切分為列表 ["items", "0", "id"]
  2. 從根對(duì)象開始,逐層向下走
  3. 當(dāng)前對(duì)象是 list 且當(dāng)前 part 是數(shù)字時(shí):
    • 解析成 int 下標(biāo),訪問對(duì)應(yīng)元素
  4. 當(dāng)前對(duì)象是 dict 時(shí):
    • 直接按照鍵訪問
  5. 如果中途類型不匹配或鍵不存在,就拋異常,由調(diào)用方統(tǒng)一處理為「未找到對(duì)應(yīng)的值」

這個(gè)函數(shù)邏輯簡(jiǎn)單清晰,但已經(jīng)覆蓋了絕大部分日常 JSON 調(diào)試的需求。

七、少量代碼實(shí)現(xiàn)一個(gè)高頻小工具

整個(gè) main.py 代碼量不大,卻完成了:

  • 一個(gè)小而美的 PyQt5 窗口應(yīng)用
  • 支持拖拽 / 打開 JSON 文件
  • 支持 KEY 路徑解析(對(duì)象 + 列表)
  • 自適應(yīng)格式化輸出結(jié)果
  • 簡(jiǎn)單但實(shí)用的狀態(tài)提示和 UI 美化

如果需要擴(kuò)展,這個(gè)工具還可以進(jìn)一步完善:

  • 支持 a[0].b 這種帶中括號(hào)的路徑語法
  • 增加「歷史 KEY」下拉列表,快速重復(fù)查詢
  • 添加「復(fù)制結(jié)果」按鈕,一鍵復(fù)制查詢結(jié)果
  • 增加「JSON 樹形視圖」,可視化瀏覽整個(gè)結(jié)構(gòu)

八、小結(jié)

這篇文章從需求出發(fā),完整拆解了 main.py 中的實(shí)現(xiàn):

  • 如何用 PyQt5 快速搭建一個(gè)桌面小工具
  • 如何用樣式表和字體調(diào)整讓界面更友好
  • 如何通過拖拽和文件選擇加載 JSON
  • 如何用簡(jiǎn)單的「點(diǎn)語法 + 數(shù)字下標(biāo)」解析 JSON 路徑

如果你也經(jīng)常需要調(diào)試接口或查看復(fù)雜 JSON,不妨參考這個(gè)實(shí)現(xiàn),按自己的習(xí)慣繼續(xù)擴(kuò)展,讓它成為你日常開發(fā)中的一個(gè)趁手小工具。

以上就是Python使用PyQt5打造一個(gè)JSON快速查看器的詳細(xì)內(nèi)容,更多關(guān)于PyQt5 JSON快速查看器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實(shí)現(xiàn)序列化及csv文件讀取

    Python實(shí)現(xiàn)序列化及csv文件讀取

    這篇文章主要介紹了Python實(shí)現(xiàn)序列化及csv文件讀取,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python調(diào)用百度api實(shí)現(xiàn)語音識(shí)別詳解

    Python調(diào)用百度api實(shí)現(xiàn)語音識(shí)別詳解

    這篇文章主要介紹了Python通過調(diào)用百度api實(shí)現(xiàn)語音識(shí)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2021-12-12
  • Python使用PaddleOCR實(shí)現(xiàn)PDF/圖片文字識(shí)別與版面還原

    Python使用PaddleOCR實(shí)現(xiàn)PDF/圖片文字識(shí)別與版面還原

    本文介紹了如何利用 PaddleOCR 實(shí)現(xiàn)對(duì) PDF 文件或圖片 的文字識(shí)別,并在識(shí)別后將文本內(nèi)容按照 原始版面位置 進(jìn)行還原重建,感興趣的小伙伴可以了解下
    2025-11-11
  • scrapy自定義pipeline類實(shí)現(xiàn)將采集數(shù)據(jù)保存到mongodb的方法

    scrapy自定義pipeline類實(shí)現(xiàn)將采集數(shù)據(jù)保存到mongodb的方法

    這篇文章主要介紹了scrapy自定義pipeline類實(shí)現(xiàn)將采集數(shù)據(jù)保存到mongodb的方法,涉及scrapy采集及操作mongodb數(shù)據(jù)庫的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • Matplotlab顯示OpenCV讀取到的圖像

    Matplotlab顯示OpenCV讀取到的圖像

    本文介紹了如何使用OpenCV和Matplotlib處理圖像,本文通過實(shí)例講解的非常詳細(xì),對(duì)Matplotlab?OpenCV圖像相關(guān)處理方法感興趣的朋友一起看看吧
    2025-02-02
  • 熵值法原理及Python實(shí)現(xiàn)的示例詳解

    熵值法原理及Python實(shí)現(xiàn)的示例詳解

    熵值法也稱熵權(quán)法,是學(xué)術(shù)研究及實(shí)際應(yīng)用中的一種常用且有效的編制指標(biāo)的方法。本文就來和大家聊聊熵值法原理及Python實(shí)現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • python實(shí)現(xiàn)根據(jù)文件格式分類

    python實(shí)現(xiàn)根據(jù)文件格式分類

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)根據(jù)文件格式分類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python使用內(nèi)置函數(shù)setattr設(shè)置對(duì)象的屬性值

    Python使用內(nèi)置函數(shù)setattr設(shè)置對(duì)象的屬性值

    這篇文章主要介紹了Python使用內(nèi)置函數(shù)setattr設(shè)置對(duì)象的屬性值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • idea2020手動(dòng)安裝python插件的實(shí)現(xiàn)方法

    idea2020手動(dòng)安裝python插件的實(shí)現(xiàn)方法

    這篇文章主要介紹了idea2020手動(dòng)安裝python插件的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于pip安裝opencv-python遇到的問題

    關(guān)于pip安裝opencv-python遇到的問題

    這篇文章主要介紹了關(guān)于pip安裝opencv-python遇到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論

澳门| 邵阳市| 尚志市| 德昌县| 石家庄市| 凤冈县| 汉沽区| 东乌珠穆沁旗| 陈巴尔虎旗| 宝应县| 沙坪坝区| 荣昌县| 姚安县| 屯昌县| 鹿邑县| 克山县| 鄂伦春自治旗| 吴堡县| 蓝山县| 疏勒县| 汨罗市| 和硕县| 光泽县| 九龙坡区| 衡东县| 碌曲县| 武安市| 平原县| 积石山| 拉萨市| 丹阳市| 饶阳县| 娱乐| 南宫市| 无锡市| 郧西县| 长沙县| 高雄市| 邓州市| 宁河县| 合肥市|