簡介
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"
}