Apakah JSONPath?
JSONPath ialah bahasa pertanyaan untuk dokumen JSON, setara JSON bagi XPath untuk XML. Stefan Goessner mencadangkannya pada tahun 2007 sebagai cara yang pendek dan boleh dibaca untuk menunjuk ke nod dalam pokok JSON tanpa menulis penghurai. Ekspresi bermula dengan pemilih akar $ dan merantai pengakses sifat, subskrip tatasusunan, kad bebas, penurunan rekursif, dan syarat penapis sehingga ia memilih nod yang anda mahu. Pada tahun 2024 IETF menerbitkan RFC 9535 untuk menstandarkan sintaks yang telah berpecah merentas pelaksanaan; penguji ini berjalan pada jsonpath-plus, pelaksanaan JavaScript yang digunakan secara meluas yang merangkumi draf Goessner, kebanyakan RFC 9535, dan beberapa pengendali sambungan tambahan.
Cara JSONPath berfungsi
Ekspresi JSONPath dibaca dari kiri ke kanan dan menelusuri dokumen JSON satu langkah pada satu masa. Setiap langkah mengambil set nod yang terselamat dari langkah sebelumnya dan menyempitkannya lebih lanjut. Saluran paip penilaian penuh:
- Jangkar dengan pemilih akar
$. Setiap ekspresi bermula di sini, menunjuk ke nilai peringkat atas, sama ada ia objek atau tatasusunan. Nama sifat kosong tanpa$awal bukan JSONPath yang sah. - Masuk ke ahli anak dengan notasi titik (
$.store.book) atau notasi kurungan ($['store']['book']). Notasi kurungan diperlukan apabila kunci mengandungi ruang, tanda hubung, atau mana-mana aksara yang bukan pengecam yang sah. - Cari setiap peringkat sekaligus dengan pengendali penurunan rekursif
... Ekspresi$..authormengumpul setiap nilaiauthordi mana-mana sahaja dalam pokok, tanpa mengira kedalaman. Ini adalah pengendali yang tidak dimiliki oleh JMESPath. - Pilih elemen tatasusunan mengikut indeks (
[0],[-1]untuk item terakhir dalam jsonpath-plus), hirisnya dengan notasi[start:end]([0:3]mengembalikan tiga pertama), atau ambil setiap elemen dengan kad bebas[*]. - Tapis elemen dengan predikat di dalam
[?(...)]. Di dalam predikat,@merujuk ke elemen semasa, jadi[?(@.price<10)]hanya menyimpan item yang medanprice-nya kurang daripada 10. Penapis bergabung dengan bahagian lain laluan, jadi anda boleh menapis kemudian menurun, atau menurun kemudian menapis. - Pilih format output. Nilai mengembalikan data yang sepadan itu sendiri. Laluan mengembalikan JSONPath setiap padanan supaya anda dapat melihat apa yang diselesaikan oleh enjin. Penunjuk mengembalikan Penunjuk JSON RFC 6901 yang setara untuk setiap padanan, berguna apabila pengguna hilir ialah JSON Patch atau pengesah JSON Schema.
Mengapa menggunakan penguji JSONPath ini?
- JSON anda tidak pernah meninggalkan pelayar. Pertanyaan berjalan di dalam halaman, jadi lekapan pengeluaran, PII pelanggan, dan respons API pra-keluaran kekal pada mesin anda.
- Enjinnya ialah
jsonpath-plus9.x, perpustakaan yang sama yang mendasari banyak suite ujian pengeluaran dan penegasan CI. Keputusan yang anda lihat di sini sepadan dengan keputusan yang akan dilihat oleh saluran paip binaan anda. - Tiga mod output merangkumi pengguna hilir yang biasa: Nilai mentah untuk salin-tampal, Laluan untuk menyahpepijat resolusi enjin, dan Penunjuk RFC 6901 untuk aliran kerja JSON Patch dan JSON Schema.
- Ekspresi penapis berjalan dengan
preventEval: true, jadi pertanyaan yang ditampalkan tidak dapat melaksanakan JavaScript sewenang-wenangnya terhadap halaman hos. Ini penting apabila ekspresi datang dari mesej Slack, tiket Jira, atau papan klip rakan sekerja.
Aplikasi biasa JSONPath
JSONPath muncul di mana-mana sahaja kod perlu menarik medan daripada muatan JSON tanpa menulis penurunan rekursif secara manual:
- Ujian Postman: tab Tests dalam Postman mendedahkan
pm.response.json()bersama akses bergaya JSONPath untuk penegasan. Pasukan menulis ekspresi tunggal seperti$.data.user.emailuntuk menarik medan daripada respons dan menegaskannya dalam CI. - Ujian beban k6: skrip k6 memanggil
jsonpath()di dalam blokcheck()untuk mengekstrak nilai daripada badan respons dan menegaskan ambang SLA. Ekspresi yang sama yang membuktikan kontrak dalam Postman boleh mengawal ujian beban di bawah k6. - DSL JSON untuk transformasi data: AWS Step Functions menilai JSONPath di dalam
InputPath,ResultPath, danParametersuntuk membentuk semula muatan peristiwa antara keadaan. Argo Workflows menggunakan JSONPath dalamwithParamuntuk mengembangkan tugas ke atas tatasusunan. Kuberneteskubectl -o jsonpathmenggunakan sintaks yang sama untuk mengekstrak medan daripada objek kelompok.
Contoh yang dikerjakan
Lekapan Goessner kanonik ialah dokumen kedai buku dengan empat buku, setiap satu membawa category, author, title, dan price. Terhadap lekapan itu, ekspresi $.store.book[?(@.price<10)].title berjalan dalam tiga langkah. Pertama, $.store.book diselesaikan kepada tatasusunan semua empat buku. Seterusnya, penapis [?(@.price<10)] hanya menyimpan satu buku yang harganya di bawah 10 (entri pada 8.95). Akhirnya, .title mengekstrak tajuk buku itu. Hasilnya ialah ["Sayings of the Century"]. Beralih ke Laluan mengembalikan ["$['store']['book'][0]['title']"], dan Penunjuk mengembalikan ["/store/book/0/title"].
Prototaipkan ekspresi anda di sini, kemudian jatuhkannya terus ke dalam Postman, k6, kubectl, atau mesin keadaan Step Functions. Tampal, tanya, salin. Tiada apa yang merentas rangkaian.
Apakah JSONPath?
JSONPath ialah bahasa pertanyaan untuk dokumen JSON, analogi dengan XPath untuk XML. Dicadangkan oleh Stefan Goessner pada tahun 2007 dan distandarkan oleh IETF sebagai RFC 9535 pada tahun 2024.
Ia menggunakan sintaks ekspresi ringkas bermula dengan $ (akar dokumen) dan menyokong notasi titik, subskrip tatasusunan, kad bebas, hirisan, penurunan rekursif (..), dan ekspresi penapis ([?(...)]) untuk memilih nod dalam pokok JSON.
Bagaimana JSONPath berbeza daripada JMESPath atau jq?
Ketiga-tiganya menanya JSON, tetapi tatabahasa dan matlamat mereka berbeza. JMESPath ialah standard AWS CLI / SDK: lebih ketat daripada JSONPath, tiada penurunan rekursif, dibina untuk unjuran bebas kesan sampingan yang boleh diramal.
jq ialah bahasa penulisan skrip lengkap Turing yang bukan sahaja menanya JSON tetapi mengubah, mengurangkan, dan mengalirkannya. JSONPath berada di antara kedua-duanya: lebih ekspresif daripada JMESPath berkat penurunan rekursif dan penapis, lebih ringan daripada jq, dan sintaks yang paling banyak disokong dalam perkakas ujian tujuan umum (Postman, Playwright, REST Assured, kubectl, Step Functions). Penguji ini melaksanakan JSONPath.
Dialek apa yang digunakan oleh penguji ini?
Penguji ini menjalankan jsonpath-plus 9.x. Perpustakaan itu melaksanakan spesifikasi Goessner 2007, merangkumi sebahagian besar RFC 9535, dan menambah pengendali sambungan seperti semakan jenis (@.string(), @.number(), @.boolean()) dan navigasi induk (^).
Bendera preventEval: true sentiasa ditetapkan, jadi predikat penapis berjalan melalui jurubahasa selamat dan bukannya JavaScript eval() terbina dalam. Pertanyaan yang ditampalkan tidak dapat melaksanakan kod sewenang-wenangnya terhadap halaman ini.
Bolehkah saya menyalin nilai yang sepadan secara individu?
Ya. Butang Salin ke papan klip menyalin blok keputusan penuh sebagai tatasusunan JSON. Untuk mengambil satu nilai, tukar mod output kepada Nilai, kemudian pilih baris yang anda mahu dalam textarea keputusan dan gunakan pintasan salin biasa pelayar anda (Ctrl/Cmd + C).
Output ialah teks JSON biasa, jadi ia ditampalkan dengan bersih ke dalam editor kod, terminal, ujian Postman, atau mesej Slack.