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 例子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章