PyQt5實現 JMESPath GUI

簡介

JMESPath是JSON的查詢語言,本人開發了一個GUI便於學習

在這裏插入圖片描述




代碼

import sys
import json
import jmespath
from PyQt5.QtGui import QTextCursor, QFont
from PyQt5.QtCore import pyqtSlot, QMetaObject
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QTextEdit, QVBoxLayout, QLabel, QStatusBar


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("JMESPath")
        self.resize(1024, 576)
        self.setFont(QFont('Consolas', 10))
        self.centralWidget = QWidget(self)
        self.setCentralWidget(self.centralWidget)

        self.statusBar = QStatusBar()
        self.setStatusBar(self.statusBar)

        self.label_1 = QLabel()
        self.label_1.setText("expression")
        self.label_2 = QLabel()
        self.label_2.setText("value")
        self.label_3 = QLabel()
        self.label_3.setText("result")

        self.expression = QTextEdit()
        self.expression.setObjectName("expression")
        self.expression.setPlainText("locations[?state == 'WA'].name | sort(@) | {WashingtonCities: join(', ', @)}")
        self.expression.setTabChangesFocus(True)

        self.value = QTextEdit()
        self.value.setObjectName("value")
        self.value.setPlainText(
            '{\n  "locations": [\n    {"name": "Seattle", "state": "WA"},\n    {"name": "New York", "state": "NY"},\n    {"name": "Bellevue", "state": "WA"},\n    {"name": "Olympia", "state": "WA"}\n  ]\n}')
        self.value.setTabChangesFocus(True)

        self.result = QTextEdit()
        self.result.setReadOnly(True)
        self.result.setPlainText('{\n  "WashingtonCities": "Bellevue, Olympia, Seattle"\n}')
        self.result.setTabChangesFocus(True)

        cursor = self.expression.textCursor()
        cursor.movePosition(QTextCursor.End)
        self.expression.setTextCursor(cursor)  # 光標移到最後

        layout = QVBoxLayout()
        layout.addWidget(self.label_1)
        layout.addWidget(self.expression, stretch=2)
        layout.addWidget(self.label_2)
        layout.addWidget(self.value, stretch=4)
        layout.addWidget(self.label_3)
        layout.addWidget(self.result, stretch=4)
        self.centralWidget.setLayout(layout)

        QMetaObject.connectSlotsByName(self)

    @pyqtSlot()
    def on_expression_textChanged(self):
        self.parse()

    @pyqtSlot()
    def on_value_textChanged(self):
        self.parse()

    def parse(self):
        try:
            expression = self.expression.toPlainText()
            # print(repr(expression))
            expression = jmespath.compile(expression)
            value = self.value.toPlainText()
            value = json.loads(value)
            # print(repr(value))
            result = expression.search(value)
            # print(result)
        except Exception as e:
            # print(e)
            pass
        else:
            result = json.dumps(result, ensure_ascii=False, indent=2)
            self.result.setPlainText(result)
            self.statusBar.showMessage("Changed!", 500)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())




測試

expression

a

value

{"a": "foo", "b": "bar", "c": "baz"}

result

"foo"




expression

[:5]

value

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

result

[
  0,
  1,
  2,
  3,
  4
]



expression

people[:2].first

value

{
  "people": [
    {"first": "James", "last": "d"},
    {"first": "Jacob", "last": "e"},
    {"first": "Jayden", "last": "f"},
    {"missing": "different"}
  ],
  "foo": {"bar": "baz"}
}

result

[
  "James",
  "Jacob"
]



expression

locations[?state == 'WA'].name | sort(@) | {WashingtonCities: join(', ', @)}

value

{
  "locations": [
    {"name": "Seattle", "state": "WA"},
    {"name": "New York", "state": "NY"},
    {"name": "Bellevue", "state": "WA"},
    {"name": "Olympia", "state": "WA"}
  ]
}

result

{
  "WashingtonCities": "Bellevue, Olympia, Seattle"
}




參考文獻

  1. JMESPath 官網
  2. JMESPath 教程
  3. JMESPath 例子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章