§

Uji ekspresi JSONPath

Format keluaran:
Referensi cepat JSONPath
Token Meaning
$Elemen root dokumen
@Elemen saat ini (digunakan di dalam ekspresi filter)
.Operator anggota anak: memilih anak bernama
..Penurunan rekursif: mencari semua keturunan
*Wildcard: cocok dengan elemen atau properti apa pun
[*]Semua item dari sebuah array
[n]Elemen array pada indeks n (berbasis nol)
[start:end]Potongan array dari start hingga (tidak termasuk) end
[?(@.x)]Filter: item di mana properti x ada
[?(@.x==1)]Filter: item di mana properti x sama dengan 1
[(@.length-1)]Ekspresi skrip: elemen terakhir dari array

JSONPath muncul di mana pun kontrak API harus diverifikasi terhadap payload nyata. Tim fintech yang menulis rangkaian regresi Postman menegaskan field respons dengan JSONPath di tab Test; skrip load-test k6 mengambil nilai dari respons API dengan jsonpath() untuk memeriksa ambang SLA di dalam blok check(); dan runbook SRE menjangkau ekspresi filter seperti [?(@.status=="error")] untuk memilah log JSON CloudWatch sebelum memberi peringatan. Menjalankan ekspresi tersebut di tab peramban menjaga payload fixture proprietary, PII pelanggan, dan respons API pra-rilis tetap di luar layanan kueri yang dihosting mana pun.

Apa itu JSONPath?

JSONPath adalah bahasa kueri untuk dokumen JSON, setara dengan XPath untuk XML. Stefan Goessner mengusulkannya pada tahun 2007 sebagai cara singkat dan mudah dibaca untuk menunjuk node di dalam pohon JSON tanpa menulis parser. Ekspresi dimulai dengan selektor root $ dan merangkai pengakses properti, subskrip array, wildcard, penurunan rekursif, dan kondisi filter hingga memilih node yang Anda inginkan. Pada tahun 2024, IETF menerbitkan RFC 9535 untuk menstandardisasi sintaks yang sebelumnya terfragmentasi di berbagai implementasi; penguji ini berjalan pada jsonpath-plus, implementasi JavaScript yang banyak digunakan yang mencakup draf Goessner, sebagian besar RFC 9535, dan beberapa operator ekstensi tambahan.

Cara kerja JSONPath

Ekspresi JSONPath dibaca dari kiri ke kanan dan menelusuri dokumen JSON satu langkah setiap kali. Setiap langkah mengambil kumpulan node yang lolos dari langkah sebelumnya dan mempersempitnya lebih lanjut. Pipeline evaluasi lengkap:

  1. Jangkar dengan selektor root $. Setiap ekspresi dimulai di sini, menunjuk pada nilai tingkat teratas, baik itu objek maupun array. Nama properti tanpa $ di awal bukan JSONPath yang valid.
  2. Masuk ke anggota anak dengan notasi titik ($.store.book) atau notasi kurung ($['store']['book']). Notasi kurung diperlukan ketika kunci mengandung spasi, tanda hubung, atau karakter apa pun yang bukan identifier yang valid.
  3. Cari setiap level sekaligus dengan operator penurunan rekursif ... Ekspresi $..author mengumpulkan setiap nilai author di mana saja dalam pohon, terlepas dari kedalaman. Ini adalah operator yang tidak dimiliki JMESPath.
  4. Pilih elemen array berdasarkan indeks ([0], [-1] untuk item terakhir di jsonpath-plus), potong dengan notasi [start:end] ([0:3] mengembalikan tiga elemen pertama), atau ambil setiap elemen dengan wildcard [*].
  5. Filter elemen dengan predikat di dalam [?(...)]. Di dalam predikat, @ mengacu pada elemen saat ini, sehingga [?(@.price<10)] hanya menyimpan item yang memiliki field price kurang dari 10. Filter tersusun dengan sisa jalur, sehingga Anda bisa memfilter kemudian turun, atau turun kemudian memfilter.
  6. Pilih format keluaran. Nilai mengembalikan data yang cocok itu sendiri. Jalur mengembalikan JSONPath setiap kecocokan sehingga Anda dapat melihat apa yang diselesaikan oleh mesin. Pointer mengembalikan RFC 6901 JSON Pointer yang setara untuk setiap kecocokan, berguna saat konsumen hilir adalah JSON Patch atau validator JSON Schema.

Mengapa menggunakan penguji JSONPath ini?

  • JSON Anda tidak pernah meninggalkan peramban. Kueri berjalan di dalam halaman, sehingga fixture produksi, PII pelanggan, dan respons API pra-rilis tetap di mesin Anda.
  • Mesinnya adalah jsonpath-plus 9.x, pustaka yang sama yang mendukung banyak rangkaian pengujian produksi dan pernyataan CI. Hasil yang Anda lihat di sini cocok dengan hasil yang akan dilihat pipeline build Anda.
  • Tiga mode keluaran mencakup konsumen hilir yang umum: Nilai mentah untuk salin-tempel, Jalur untuk men-debug resolusi mesin, dan RFC 6901 Pointer untuk alur kerja JSON Patch dan JSON Schema.
  • Ekspresi filter berjalan dengan preventEval: true, sehingga kueri yang ditempel tidak dapat mengeksekusi JavaScript sembarang terhadap halaman host. Hal itu penting ketika ekspresi berasal dari pesan Slack, tiket Jira, atau clipboard rekan kerja.

Aplikasi umum JSONPath

JSONPath muncul di mana saja kode harus mengambil field dari payload JSON tanpa menulis penurunan rekursif secara manual:

  • Pengujian Postman: tab Tests di Postman memaparkan pm.response.json() beserta akses gaya JSONPath untuk pernyataan. Tim menulis ekspresi tunggal seperti $.data.user.email untuk mengambil field dari respons dan menegaskannya di CI.
  • Load test k6: skrip k6 memanggil jsonpath() di dalam blok check() untuk mengekstrak nilai dari body respons dan menegaskan ambang SLA. Ekspresi yang sama yang membuktikan kontrak di Postman bisa memblokir load test di k6.
  • DSL JSON untuk transformasi data: AWS Step Functions mengevaluasi JSONPath di dalam InputPath, ResultPath, dan Parameters untuk membentuk ulang payload event antar state. Argo Workflows menggunakan JSONPath di withParam untuk mem-fan-out tugas melalui array. kubectl -o jsonpath Kubernetes menggunakan sintaks yang sama untuk mengekstrak field dari objek cluster.

Contoh yang dikerjakan

Fixture Goessner kanonik adalah dokumen toko buku dengan empat buku, masing-masing membawa category, author, title, dan price. Terhadap fixture tersebut, ekspresi $.store.book[?(@.price<10)].title berjalan dalam tiga langkah. Pertama, $.store.book memecahkan ke array semua empat buku. Berikutnya, filter [?(@.price<10)] hanya menyimpan satu buku dengan harga di bawah 10 (entri pada 8,95). Terakhir, .title mengekstrak judul buku tersebut. Hasilnya adalah ["Sayings of the Century"]. Beralih ke Jalur mengembalikan ["$['store']['book'][0]['title']"], dan Pointer mengembalikan ["/store/book/0/title"].

Buat prototipe ekspresi Anda di sini, lalu masukkan langsung ke Postman, k6, kubectl, atau mesin state Step Functions. Tempel, kueri, salin. Tidak ada yang melewati jaringan.

Apa itu JSONPath?

JSONPath adalah bahasa kueri untuk dokumen JSON, analog dengan XPath untuk XML. Diusulkan oleh Stefan Goessner pada tahun 2007 dan distandardisasi oleh IETF sebagai RFC 9535 pada tahun 2024, sintaks ekspresi ringkasnya dimulai dengan $ (root dokumen) dan mendukung notasi titik, subskrip array, wildcard, potongan, penurunan rekursif (..), dan ekspresi filter ([?(...)]) untuk memilih node di dalam pohon JSON.

Apa perbedaan JSONPath dengan JMESPath atau jq?

Ketiganya mengkueri JSON, tetapi tata bahasa dan tujuannya berbeda. JMESPath adalah standar AWS CLI/SDK: lebih ketat dari JSONPath, tanpa penurunan rekursif, dibangun untuk proyeksi tanpa efek samping yang dapat diprediksi. jq adalah bahasa skrip Turing-complete yang tidak hanya mengkueri JSON tetapi juga mentransformasi, mereduksi, dan mengalirkannya. JSONPath berada di antara keduanya: lebih ekspresif dari JMESPath berkat penurunan rekursif dan filter, lebih ringan dari jq, dan sintaks yang paling banyak didukung dalam alat pengujian serba guna (Postman, Playwright, REST Assured, kubectl, Step Functions). Penguji ini mengimplementasikan JSONPath.

Dialek apa yang digunakan penguji ini?

Penguji ini menjalankan jsonpath-plus 9.x. Pustaka tersebut mengimplementasikan spesifikasi Goessner 2007, mencakup sebagian besar RFC 9535, dan menambahkan operator ekstensi seperti pemeriksaan tipe (@.string(), @.number(), @.boolean()) dan navigasi parent (^). Flag preventEval: true selalu disetel, sehingga predikat filter berjalan melalui interpreter yang aman daripada built-in JavaScript eval(). Kueri yang ditempel tidak dapat mengeksekusi kode sembarang terhadap halaman ini.

Bisakah saya menyalin nilai yang cocok secara individual?

Ya. Tombol Salin ke papan klip menyalin blok hasil lengkap sebagai array JSON. Untuk mengambil satu nilai, alihkan mode keluaran ke Nilai, lalu pilih baris yang Anda inginkan di textarea hasil dan gunakan pintasan salin normal peramban Anda (Ctrl/Cmd + C). Keluarannya adalah teks JSON biasa, sehingga dapat ditempel dengan bersih ke editor kode, terminal, pengujian Postman, atau pesan Slack.