Skip to content

Penguji JSONPath Gratis — Evaluasi Kueri Online

Uji ekspresi JSONPath terhadap JSON apa pun secara instan. Mesin standar RFC 9535 plus mode Klasik Goessner, tampilan Values / Paths / Both, path ternormalisasi, tanpa eval. 100% privat di browser, tanpa unggah.

Tanpa Pelacakan Berjalan di Browser Gratis
Semua evaluasi berjalan secara lokal di browser Anda. JSON dan ekspresi Anda tidak pernah meninggalkan perangkat ini. Tanpa eval, tanpa unggah.
Mesin
 
Lembar contekan JSONPath
$Elemen akar
@Elemen saat ini (dalam filter)
.nameAnggota anak
..namePenurunan rekursif
[*]Semua elemen / anggota
[0]Indeks larik
[0:2]Irisan larik [start:end:step]
[a,b]Gabungan nama / indeks
[?(@.k>1)]Ekspresi filter
length()Fungsi RFC 9535: length / count / match / search / value
Ditinjau untuk kesetiaan tata bahasa RFC 9535, ketepatan path ternormalisasi, paritas semantik mesin ganda pada path umum dan divergensi terdokumentasi dalam kasus tepi, keamanan tanpa-eval (menutup CVE-2024-21534 dan CVE-2025-1302), dan aksesibilitas (peran ARIA, toggle mesin radiogroup, pengumuman hasil pembaca layar, penanganan JSON LTR di bawah tata letak RTL). — Tim Data Tooling Go Tools · Jun 13, 2026

Apa Itu Penguji JSONPath?

Penguji JSONPath adalah alat yang memungkinkan Anda menulis ekspresi JSONPath, menempel dokumen JSON, dan melihat persis node mana yang dipilih ekspresi tersebut — baik nilai yang cocok maupun lokasinya yang presisi — tanpa menulis kode atau menjalankan skrip. Bagi pengembang, ia memperpendek putaran dari menit menjadi milidetik: ubah path, lihat hasil berubah, dan kirimkan kueri dengan percaya diri.

JSONPath adalah bahasa kueri untuk JSON, analog JSON dari XPath untuk XML. Sebuah ekspresi dibangun dari alfabet kecil selektor. $ adalah akar dokumen. Sebuah titik atau tanda kurung melangkah ke anak: $.store atau $['store']. Titik ganda .. adalah penurunan rekursif — ia mencari setiap tingkat pohon. Wildcard * memilih semua elemen atau anggota. Tanda kurung membawa indeks larik ([0]), irisan ([start:end:step]), gabungan ([a,b]), dan ekspresi filter ([?(@.price < 10)], di mana @ adalah elemen yang sedang diuji). Dengan potongan-potongan itu Anda dapat menarik satu bidang dari respons API yang tersarang dalam, menegaskan nilai dalam pengujian, menggerakkan transformasi data dalam sistem seperti Kubernetes, AWS Step Functions, dan Azure Logic Apps, atau mengekstrak data terstruktur dari JSON tidak beraturan — semua tanpa kode penelusuran imperatif. JSONPath juga terkenal tidak konsisten antar implementasi, yang justru merupakan masalah yang dimunculkan oleh penguji yang baik sebelum mencapai produksi.

Penguji ini membawa dua mesin. Default adalah mesin RFC 9535: RFC 9535 adalah spesifikasi formal JSONPath dari IETF pada Februari 2024, pertama kalinya bahasa ini distandarkan secara presisi setelah lima belas tahun implementasi yang berbeda-beda. Ia mendefinisikan tata bahasa yang eksak, konsep path ternormalisasi untuk hasil, dan lima fungsi standar — length(), count(), match(), search(), value(). Mesin RFC 9535 kami adalah implementasi tanpa dependensi yang tidak menggunakan eval, sehingga ia mengurai dan menafsirkan ekspresi dengan tata bahasanya sendiri alih-alih mengompilasinya ke JavaScript. Mesin kedua adalah Klasik (Goessner), dialek de facto 2007 yang diimplementasikan sebagian besar alat dan pustaka online lebih lama; beralihlah ke sana untuk mereproduksi hasil dari alat seperti jsonpath.com atau menjalankan ekspresi yang Anda salin dari kode lawas. Kedua dialek sepakat pada path umum tetapi berbeda dalam kasus tepi — spasi dan tanda kutip filter, urutan gabungan, bagaimana anggota yang hilang dibandingkan, dan fungsi mana yang ada — sehingga dapat beralih di antaranya di satu tempat adalah cara tercepat untuk mendiagnosis mengapa sebuah ekspresi berperilaku berbeda dari yang Anda harapkan.

Apa yang dimunculkan penguji di luar nilai mentah: hasil dari kueri JSONPath adalah nodelist, dan alat ini dapat menampilkannya dalam tiga cara. Tampilan Values merender node yang cocok sebagai larik JSON, persis apa yang akan Anda konsumsi dalam kode. Tampilan Paths merender path ternormalisasi setiap kecocokan — lokasi kanonis berkurung-kutip seperti $['store']['book'][0]['title'] yang secara unik mengidentifikasi di mana dalam dokumen nilai itu berada, terlepas dari bagaimana ekspresi ditulis. Dua ekspresi yang memilih node yang sama menghasilkan path ternormalisasi yang sama, yang membuat tampilan Paths sangat berharga untuk debugging. Tampilan Both menunjukkan nilai dan path berdampingan. Baris statistik melaporkan berapa banyak node yang cocok.

Keamanan adalah perhatian kelas-satu di sini. Banyak evaluator JSONPath online berjalan di server, atau menyematkan pustaka yang mengevaluasi predikat filter dengan JavaScript eval — desain yang menghasilkan kerentanan eksekusi kode jarak jauh yang dilacak sebagai CVE-2024-21534 dan CVE-2025-1302 dalam paket JSONPath yang banyak digunakan. Alat ini tidak menggunakan eval sama sekali. Mesin RFC 9535 tidak memiliki jalur eval, dan mesin Klasik dibangun di atas rilis jsonpath-plus yang ditambal dan disematkan dengan eval dinonaktifkan secara eksplisit. Itu menutup kelas bug RCE dan memungkinkan alat berjalan di bawah Content-Security-Policy ketat yang melarang unsafe-eval. Setiap evaluasi bersifat lokal: JSON dan ekspresi Anda tidak pernah meninggalkan halaman, tidak pernah dicatat, dan tidak pernah disimpan ke disk — hanya preferensi mesin dan tampilan Anda yang bertahan ke localStorage. Itu membuat alat aman untuk payload API berpemilik, log yang disunting, konfigurasi internal, dan data apa pun dengan skema yang tidak akan Anda tempel ke layanan berbasis server.

Jika pengolahan JSON adalah tugas Anda, pasangkan ini dengan alat JSON lain di situs: format dan cetak rapi masukan Anda dengan JSON Formatter, bandingkan dua dokumen dengan JSON Diff, periksa payload terhadap skema dengan JSON Schema Validator, atau ubah respons sampel menjadi antarmuka bertipe dengan JSON to TypeScript.

// The expression you build in this tester maps straight onto the
// RFC 9535 reference library used under the hood.
import { query, paths } from 'jsonpath-rfc9535';

const document = {
  store: {
    book: [
      { title: 'Sayings of the Century', author: 'Nigel Rees', price: 8.95 },
      { title: 'Sword of Honour', author: 'Evelyn Waugh', price: 12.99 },
      { title: 'Moby Dick', author: 'Herman Melville', price: 8.99 },
      { title: 'The Lord of the Rings', author: 'J. R. R. Tolkien', price: 22.99 }
    ]
  }
};

// Values: query(document, path) returns the matched values directly.
const titles = query(document, '$.store.book[*].title');
// → ['Sayings of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']

// Filter: books cheaper than 10.
const cheap = query(document, '$.store.book[?(@.price < 10)].title');
// → ['Sayings of the Century', 'Moby Dick']

// Normalized paths: paths(document, path) returns where each match lives.
const authorPaths = paths(document, '$..author');
// → ["$['store']['book'][0]['author']", "$['store']['book'][1]['author']", ...]

// RFC 9535 functions like length() are used INSIDE filters, not as a segment.
const longTitles = query(document, '$.store.book[?length(@.title) > 15]');
// → the two books whose title is longer than 15 characters

Fitur Utama

Mesin Standar RFC 9535 (Tanpa Eval)

Mesin default mengimplementasikan RFC 9535, spesifikasi JSONPath formal IETF 2024 — tata bahasa eksak, path ternormalisasi, dan lima fungsi standar. Ia tanpa dependensi dan tidak menggunakan eval, sehingga mengurai dan menafsirkan ekspresi dengan tata bahasanya sendiri alih-alih mengompilasinya ke JavaScript. Ia berjalan di bawah Content-Security-Policy yang ketat.

Mode Kompatibilitas Klasik (Goessner)

Satu toggle beralih ke mesin yang kompatibel dengan Goessner (dibangun di atas jsonpath-plus, dikonstruksi dengan eval dinonaktifkan) sehingga ekspresi yang disalin dari alat lebih lama seperti jsonpath.com berperilaku seperti yang Anda lihat di sana. Beralihlah antara RFC 9535 dan Klasik untuk membandingkan hasil dan mendiagnosis mengapa sebuah path cocok berbeda lintas dialek.

Tiga Tampilan Hasil: Values, Paths, Both

Values merender node yang cocok sebagai larik JSON, persis apa yang Anda konsumsi dalam kode. Paths merender path ternormalisasi setiap kecocokan seperti $['store']['book'][0]['title']. Both menunjukkan keduanya berdampingan sehingga Anda dapat memetakan setiap nilai ke lokasi presisnya. Tampilan aktif bertahan lintas sesi.

Path Ternormalisasi untuk Setiap Kecocokan

Setiap hasil membawa path ternormalisasi kanonis berkurung-kutipnya — cara RFC 9535 mengidentifikasi lokasi node secara unik terlepas dari bagaimana ekspresi ditulis. Dua ekspresi yang mengenai node yang sama menghasilkan path ternormalisasi yang sama, yang membuat debugging kueri ambigu menjadi mudah.

Dukungan Selektor Penuh

Akar $, elemen saat ini @, anak .name, penurunan rekursif ..name, wildcard [*], indeks larik [0], irisan [start:end:step], gabungan [a,b], dan ekspresi filter [?()] dengan operator perbandingan dan logika. Lembar contekan bawaan mendokumentasikan setiap selektor sehingga Anda tidak pernah harus meninggalkan halaman untuk mencarinya.

Ekstensi Fungsi RFC 9535

Panggil length(), count(), match(), search(), dan value() di dalam ekspresi — hitung elemen larik, uji string terhadap pola I-Regexp, atau saring berdasarkan ukuran daftar tersarang. Fungsi standar ini tersedia di mesin default; alat memberi tahu Anda untuk beralih mesin jika Anda memanggilnya dalam mode Klasik.

Format, Unggah & Contoh

Format JSON mencetak rapi masukan Anda agar strukturnya terbaca sebelum Anda mengkueri. Unggah membaca berkas .json atau .txt sepenuhnya di browser — ia tidak pernah dikirim ke mana pun. Dropdown Examples memuat ekspresi awal yang dikenal-baik terhadap data sampel sehingga Anda melihat mesin bekerja sebelum mengadaptasi path.

Berbagi Tautan Permanen (Tanpa Unggah)

Salin tautan mengodekan JSON, ekspresi, mesin, dan tampilan ke dalam hash URL. Browser tidak pernah mengirimkan fragmen URL dalam permintaan, sehingga tautan yang dibagikan mereproduksi seluruh keadaan Anda di mesin penerima tanpa menyentuh server go-tools.org. Mandiri dan ramah-audit untuk debugging kolaboratif.

100% Privat, Hanya Browser

JSON dan ekspresi Anda tidak pernah meninggalkan perangkat Anda. Tanpa permintaan jaringan, tanpa pencatatan, tanpa analitik atas apa yang Anda ketik — verifikasi di DevTools → Network. Hanya preferensi mesin dan tampilan yang bertahan ke localStorage. Aman untuk payload berpemilik, log yang disunting, dan data apa pun yang tidak akan Anda tempel ke jsonpath.com.

Contoh yang Dikerjakan

Pilih setiap judul buku dari dokumen toko buku

$.store.book[*].title
["Sayings of the Century", "Sword of Honour", "Moby Dick", "The Lord of the Rings"]

Tempel JSON toko buku Goessner klasik, ketik ekspresinya, dan tampilan Values mengembalikan larik JSON berisi keempat judul. Beralih ke Paths untuk melihat setiap hasil sebagai path ternormalisasi seperti $['store']['book'][0]['title']. Wildcard [*] mengiterasi setiap elemen larik book; .title memproyeksikan satu anggota dari masing-masing.

Saring buku yang lebih murah dari 10 dengan ekspresi filter

$.store.book[?(@.price < 10)].title
["Sayings of the Century", "Moby Dick"]

Selektor filter [?()] hanya menyimpan elemen larik yang predikatnya bernilai benar; @ adalah elemen saat ini. Terhadap data toko buku (harga 8.95, 12.99, 8.99, 22.99) dua buku memenuhi syarat. Kedua mesin menerima bentuk ini, tetapi perhatikan bahwa Klasik (Goessner) menulis filter yang sama sebagai [?(@.price<10)] — beralihlah mesin jika Anda menyalin ekspresi dari alat yang lebih lama.

Telusuri seluruh pohon dengan penurunan rekursif

$..author
["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"]

Operator .. turun ke setiap tingkat dokumen dan mengumpulkan setiap anggota author di mana pun ia muncul, terlepas dari kedalaman penyarangan. Penurunan rekursif adalah cara tercepat untuk menarik satu bidang dari struktur yang tersarang dalam atau tidak beraturan tanpa mengeja path lengkap.

Iris larik dengan [start:end:step]

$.store.book[0:2].title
["Sayings of the Century", "Sword of Honour"]

Irisan larik mengikuti konvensi setengah-terbuka [start:end] yang sama seperti Python dan JavaScript: indeks 0 hingga tetapi tidak termasuk indeks 2 mengembalikan dua buku pertama. Tambahkan bidang ketiga untuk langkah — $.store.book[::2] mengambil setiap elemen kedua. Batas akhir bersifat eksklusif, jebakan off-by-one umum yang dibuat jelas oleh tampilan Paths.

Saring berdasarkan panjang judul dengan fungsi length() RFC 9535

$.store.book[?length(@.title) > 15]
[{"title": "Sayings of the Century", "author": "Nigel Rees", "price": 8.95}, {"title": "The Lord of the Rings", "author": "J. R. R. Tolkien", "price": 22.99}]

length() adalah salah satu dari lima fungsi standar RFC 9535, dan ia hanya valid di dalam ekspresi filter [?...] — tidak pernah sebagai segmen path mandiri seperti $.store.book.length(), yang ditolak oleh tata bahasa RFC 9535 (bentuk segmen itu adalah ekstensi jsonpath-plus, bukan JSONPath standar). Di sini filter menyimpan setiap buku yang judulnya memiliki lebih dari 15 karakter; terhadap data toko buku, judul yang lebih panjang dari 15 karakter dipilih (misalnya "Sayings of the Century" dan "The Lord of the Rings"), sementara yang lebih pendek seperti "Moby Dick" dan "Sword of Honour" dikecualikan. count(), match(), search(), dan value() juga digunakan di dalam filter. Fungsi-fungsi ini adalah fitur RFC 9535 — beralihlah ke mesin standar (default) untuk menggunakannya; mode Klasik (Goessner) tidak mengimplementasikannya.

Pilih gabungan dari dua anggota bernama

$.store.book[0]['title','author']
["Sayings of the Century", "Nigel Rees"]

Selektor gabungan [a,b] mengumpulkan beberapa anak dalam satu ekspresi. Di sini ia menarik baik title maupun author dari buku pertama. Gabungan juga bekerja dengan indeks larik — [0,2] mengambil elemen pertama dan ketiga. Tampilan Both memasangkan setiap nilai dengan path ternormalisasinya sehingga Anda dapat melihat persis anggota mana yang menghasilkan hasil mana.

Cara Menggunakan Penguji JSONPath

  1. 1

    Tempel atau unggah JSON Anda

    Jatuhkan JSON ke kotak masukan, tempelkan, atau klik Unggah untuk memuat berkas .json / .txt dari disk. Format JSON mengindentasi ulang dokumen. JSON tidak valid ditandai sebaris dengan pesan parser sebelum Anda mengkueri.

  2. 2

    Pilih sebuah mesin

    RFC 9535 (standar IETF 2024, tanpa eval) adalah default. Beralih ke Klasik (Goessner) saat Anda menjalankan ekspresi yang disalin dari alat lebih lama seperti jsonpath.com agar hasilnya cocok dengan apa yang Anda lihat di sana.

  3. 3

    Ketik ekspresi JSONPath Anda

    Awalan $ sudah ditampilkan untuk Anda. Mulailah dengan path anak seperti .store.book[*].title, indeks seperti [0], penurunan rekursif seperti ..author, atau filter seperti [?(@.price < 10)]. Hasil diperbarui secara langsung saat Anda mengetik.

  4. 4

    Beralih tampilan hasil

    Values menunjukkan larik JSON dari nilai yang cocok. Paths menunjukkan path ternormalisasi setiap kecocokan seperti $['store']['book'][0]['title']. Both menunjukkan keduanya berdampingan sehingga Anda dapat memetakan setiap nilai ke lokasi persisnya dalam dokumen.

  5. 5

    Salin hasil atau bagikan tautan permanen

    Salin hasil menempatkan keluaran di papan klip Anda. Salin tautan mengodekan JSON, ekspresi, mesin, dan tampilan ke dalam hash URL (tanpa unggah) sehingga kolega dapat mereproduksi kueri persis secara lokal di mesin mereka sendiri.

Kesalahan JSONPath Umum

Lupa akar $ di awal

Setiap ekspresi JSONPath dimulai pada akar, ditulis sebagai $. Menghilangkannya (atau menulis path seolah-olah $ tersirat) membuat sebagian besar mesin menolak ekspresi. Penguji menampilkan $ untuk Anda, jadi mulailah masukan Anda dengan selektor berikutnya — titik, tanda kurung, atau penurunan rekursif.

✗ Salah
store.book[*].title  →  invalid (no root)
✓ Benar
$.store.book[*].title  →  selects every title

Off-by-one irisan — mengharapkan indeks akhir disertakan

Irisan bersifat setengah-terbuka: [start:end] berjalan hingga tetapi tidak termasuk end. [0:2] mengembalikan dua elemen (indeks 0 dan 1), bukan tiga. Untuk menyertakan elemen terakhir berdasarkan indeks, gunakan [start:] atau dorong batas akhir satu melewatinya.

✗ Salah
$.store.book[0:2]  →  first TWO books, not three
✓ Benar
$.store.book[0:3]  →  first three books (indices 0,1,2)

Menggunakan ekspresi Klasik di mesin RFC 9535 (atau sebaliknya)

Ekspresi yang disalin dari jsonpath.com atau jsonpath-plus dapat diurai atau dicocokkan berbeda di bawah RFC 9535 karena perbedaan filter, gabungan, dan fungsi. Jika hasil terlihat salah, beralihlah toggle mesin agar cocok dengan dialek yang menjadi tujuan penulisan ekspresi.

✗ Salah
Classic filter run under RFC 9535  →  parse error or unexpected nodes
✓ Benar
Switch engine to Classic (Goessner)  →  reproduces the original result

Memanggil fungsi RFC 9535 sebagai segmen mandiri

length(), count(), match(), search(), dan value() adalah ekstensi fungsi RFC 9535 yang hanya valid di dalam filter [?...]. Pemanggilan segmen mandiri seperti $.store.book.length() ditolak oleh tata bahasa RFC 9535 (ia adalah ekstensi jsonpath-plus, bukan standar). Panggil fungsi di dalam filter, dan gunakan mesin RFC 9535 default — mesin Klasik (Goessner) tidak mengimplementasikan fungsi-fungsi ini.

✗ Salah
$.store.book.length()  →  parse error (not a valid RFC 9535 segment)
✓ Benar
$.store.book[?length(@.title) > 15]  →  books with a title over 15 chars

Lupa @ di dalam ekspresi filter

Di dalam filter [?()], elemen saat ini adalah @, bukan $. Menulis $.price merujuk kembali ke akar dokumen alih-alih elemen yang diuji, sehingga filter memilih tidak ada atau semuanya. Gunakan @ untuk mengalamatkan anggota dari elemen yang sedang disaring.

✗ Salah
$.store.book[?($.price < 10)]  →  wrong scope
✓ Benar
$.store.book[?(@.price < 10)]  →  books under 10

Mengutip nama anggota dengan sintaks yang salah

Notasi kurung memerlukan tanda kutip di sekitar kunci string: $['store'] atau $.store keduanya berfungsi, tetapi $[store] (tanpa kutip di dalam kurung) adalah kesalahan indeks/pengidentifikasi. Gunakan tanda kutip di dalam kurung untuk kunci apa pun dengan spasi, titik, atau karakter khusus: $['first name'].

✗ Salah
$[store][book]  →  invalid bracket selectors
✓ Benar
$['store']['book']  →  same as $.store.book

Mengharapkan penurunan rekursif berhenti di tingkat pertama

$..author tidak berhenti di atas — ia mengumpulkan setiap anggota author di setiap kedalaman. Jika Anda hanya menginginkan anak langsung, eja path-nya. Penurunan rekursif atas dokumen besar dapat mengembalikan jauh lebih banyak node daripada yang dimaksudkan.

✗ Salah
$..price  →  every price anywhere in the tree
✓ Benar
$.store.book[*].price  →  only book prices

Siapa yang Menggunakan Alat Ini

Ekstrak Bidang dari Respons API
Tarik ID permintaan, atribut sumber daya tersarang, atau daftar nama dari payload JSON tanpa menulis kode penelusuran. Bangun path di sini terhadap respons sampel, konfirmasi ia mengembalikan persis node yang Anda inginkan di tampilan Values, lalu tempel ekspresi yang divalidasi ke aplikasi atau pengujian Anda.
Tulis Asersi untuk Pengujian Integrasi
Banyak kerangka kerja pengujian dan alat pengujian-kontrak (REST Assured, Karate, Postman) menggunakan JSONPath untuk menegaskan badan respons. Susun path asersi di sini, verifikasi ia memilih node yang tepat terhadap respons nyata, dan salin ke pengujian Anda — menangkap path yang salah sebelum suite menjadi merah.
Konfigurasi Transformasi Data dalam Pipeline
Kubernetes, AWS Step Functions, Azure Logic Apps, dan banyak alat ETL menerima JSONPath untuk mengalamatkan bidang dalam payload kejadian. Prototipekan path persis terhadap kejadian representatif di sini, konfirmasi ia menyelesaikan, dan letakkan ke konfigurasi pipeline Anda dengan keyakinan bahwa ia menunjuk ke tempat yang Anda maksudkan.
Reproduksi Hasil jsonpath.com secara Privat
Memiliki ekspresi dari evaluator berbasis server tetapi tidak dapat menempel data Anda ke situs pihak ketiga? Beralihlah ke mode Klasik (Goessner), muat JSON Anda, dan reproduksi hasil yang sama secara lokal — tidak ada payload yang pernah meninggalkan browser Anda, sehingga data berpemilik tetap di mesin Anda.
Migrasikan Ekspresi Lawas ke RFC 9535
Beralih ke sistem yang mengiklankan kepatuhan RFC 9535? Jalankan ekspresi lawas dalam mode Klasik, lalu beralih ke mesin RFC 9535 untuk melihat apakah ia masih diurai dan mencocokkan node yang sama. Perbandingan mesin ganda menunjukkan dengan tepat perbedaan filter, gabungan, dan fungsi yang sebaliknya akan Anda temui di produksi.
Debug Mengapa Sebuah Path Mengembalikan Node yang Salah
Sebuah path yang memilih terlalu banyak atau terlalu sedikit sulit dipikirkan dari nilai saja. Beralihlah ke tampilan Paths untuk melihat lokasi ternormalisasi setiap kecocokan — indeks larik persis, rantai anggota persis — dan irisan off-by-one atau penurunan rekursif liar menjadi jelas seketika.
Ajarkan atau Tinjau JSONPath
Buka ekspresi yang berfungsi terhadap data sampel dan telusuri selektor demi selektor, beralih antara Values dan Paths sehingga pembelajar melihat baik apa yang dipilih maupun di mana ia berada. Lembar contekan dan contoh yang dikerjakan memberikan referensi terstruktur untuk tinjauan kode atau onboarding.

Catatan Mesin & Algoritme

Mesin RFC 9535 (jsonpath-rfc9535, Tanpa Dependensi)
Mesin default mengimplementasikan tata bahasa IETF RFC 9535 secara langsung: ia mentokenisasi dan mengurai ekspresi menjadi pohon sintaks abstrak dan menafsirkannya terhadap dokumen. Tidak ada eval dan tidak ada konstruktor Function di mana pun dalam jalur, sehingga ia kebal terhadap kelas bug injeksi-eval dan berjalan di bawah Content-Security-Policy yang ketat.
Mesin Klasik (jsonpath-plus, Eval Dinonaktifkan)
Mesin Klasik (Goessner) adalah jsonpath-plus, disematkan ke rilis yang ditambal (>= 10.4.0) dan dikonstruksi dengan opsi eval disetel secara eksplisit ke false. Itu mempertahankan kompatibilitas dialek-Goessner sambil menutup vektor eksekusi kode jarak jauh yang dilacak sebagai CVE-2024-21534 dan CVE-2025-1302, yang memengaruhi jalur filter berbasis eval default pustaka.
Pembuatan Path Ternormalisasi
Setiap kecocokan dilaporkan dengan path ternormalisasi RFC 9535-nya — bentuk kanonis menggunakan notasi kurung berkutip-tunggal ($['store']['book'][0]['title']) dengan indeks larik sebagai integer telanjang. Path ternormalisasi stabil dan unik per node, sehingga ekspresi setara menghasilkan path identik, yang diandalkan tampilan Paths dan Both untuk identifikasi hasil yang tidak ambigu.
Potongan Mesin yang Dimuat Malas
Kedua mesin dimuat sebagai potongan JavaScript terpisah hanya saat pertama kali dipilih, sehingga halaman awal tetap ringan dan mesin yang tidak Anda gunakan tidak pernah diunduh. Beralih mesin mengevaluasi ulang ekspresi saat ini terhadap dokumen saat ini seketika, tanpa muat ulang halaman.
Pembacaan Berkas Lokal dan Pemformatan JSON
Tombol Unggah menggunakan API FileReader browser untuk membaca berkas .json atau .txt ke dalam masukan sepenuhnya sisi-klien — berkas tidak pernah dikirimkan. Format JSON mengurai dan menserialisasi ulang masukan dengan indentasi dua spasi, memunculkan kesalahan parse sebaris sehingga JSON yang cacat tertangkap sebelum evaluasi.
Tautan Permanen via Hash URL (Tidak Pernah Dikirimkan)
Keadaan berbagi dikodekan dalam fragmen location.hash, membawa JSON, ekspresi, mesin aktif, dan tampilan hasil. Browser tidak pernah menyertakan fragmen dalam permintaan HTTP, sehingga server go-tools.org menerima nol data saat tautan permanen dibuka; hidrasi terjadi sepenuhnya di perangkat penerima.

Praktik Terbaik JSONPath

Pilih Mesin yang Cocok dengan Target Anda
Jika sistem hilir Anda mengiklankan kepatuhan RFC 9535, tulis dan validasi terhadap mesin RFC 9535. Jika Anda mereproduksi atau memelihara ekspresi dari alat atau pustaka lebih lama, gunakan Klasik (Goessner). Validasi terhadap dialek yang salah adalah alasan paling umum mengapa path yang berfungsi di penguji gagal di produksi.
Verifikasi dengan Tampilan Paths, Bukan Hanya Values
Tampilan Values memberi tahu Anda apa yang cocok; tampilan Paths memberi tahu Anda di mana. Saat kueri mengembalikan nilai yang terlihat benar, ia mungkin masih memilihnya dari lokasi yang salah — penurunan rekursif liar atau wildcard yang terlalu luas. Periksa path ternormalisasi untuk mengonfirmasi ekspresi mengenai persis node yang Anda maksudkan.
Perhatikan Akhir Eksklusif dari Irisan
[0:2] memilih indeks 0 dan 1, bukan 0 hingga 2 — batas akhir bersifat eksklusif, persis seperti Python dan JavaScript. Kesalahan irisan off-by-one adalah bug JSONPath paling sering. Gunakan tampilan Paths untuk membaca indeks persis setiap elemen yang dipilih dan konfirmasi batas sebelum Anda mengirim.
Utamakan Path Eksplisit Dibanding Penurunan Rekursif Bila Bisa
$..price nyaman tetapi mencocokkan setiap price di mana pun dalam dokumen, termasuk yang tidak Anda maksudkan. Saat Anda mengetahui strukturnya, eja path ($.store.book[*].price) agar kueri tetap presisi dan dapat diprediksi seiring data bertumbuh. Cadangkan .. untuk bentuk yang benar-benar tidak beraturan atau tidak dikenal.
Jaga Spasi dan Tanda Kutip Konsisten dalam Filter
RFC 9535 mengikuti tata bahasanya secara persis untuk ekspresi filter, sementara dialek klasik lebih longgar. Tulis filter dengan bersih — kutip literal string dengan tanda kutip tunggal ('fiction'), jaga operator diberi spasi, dan hindari mengandalkan parsing yang longgar — sehingga ekspresi yang sama dievaluasi dengan cara yang sama terlepas dari mesin atau pustaka mana yang akhirnya menjalankannya.

Pertanyaan yang Sering Diajukan

Apakah JSON atau ekspresi JSONPath saya dikirim ke server Anda?
Tidak. Setiap evaluasi berjalan dalam JavaScript di dalam browser Anda. Dokumen JSON dan ekspresi JSONPath Anda tidak diunggah, tidak dicatat, tidak disimpan ke disk, dan tidak dikirim ke pihak ketiga mana pun. Hanya preferensi UI Anda — mesin yang aktif (RFC 9535 atau Klasik) dan tampilan hasil (Values / Paths / Both) — yang disimpan ke localStorage agar halaman mengingatnya pada kunjungan berikutnya; JSON dan ekspresi itu sendiri tidak pernah dipertahankan. Anda dapat memverifikasi dengan membuka DevTools → Network: mengetik di kotak mana pun memicu nol permintaan. Itu membuat alat ini aman untuk payload API berpemilik, sampel log yang disunting, konfigurasi internal, dan apa pun lainnya yang tidak akan Anda tempel ke evaluator berbasis server seperti jsonpath.com.
Apa itu JSONPath dan untuk apa ia digunakan?
JSONPath adalah bahasa kueri untuk JSON, sama seperti XPath adalah bahasa kueri untuk XML. Anda menulis ekspresi path — misalnya $.store.book[*].author — dan evaluator mengembalikan setiap nilai dalam dokumen yang dipilih oleh path tersebut. Ia digunakan untuk menarik bidang tertentu dari respons API, untuk menegaskan nilai dalam pengujian integrasi, untuk mengonfigurasi transformasi data di alat seperti Jenkins, Kubernetes, AWS Step Functions, dan Azure Logic Apps, dan untuk mengekstrak data dari JSON besar atau tidak beraturan tanpa menulis kode penelusuran imperatif. Sebuah ekspresi dibangun dari sumbu selektor: $ (akar), . atau [] (akses anak), .. (penurunan rekursif), * (wildcard), [start:end:step] (irisan larik), [a,b] (gabungan), dan [?()] (filter). Penguji ini mengevaluasi ekspresi secara langsung dan menampilkan baik nilai yang cocok maupun path ternormalisasinya.
Apa perbedaan antara RFC 9535 dan sintaks Goessner klasik?
JSONPath Klasik adalah sintaks de facto yang dipublikasikan Stefan Goessner pada 2007. Ia menjadi diimplementasikan secara luas tetapi tidak pernah distandarkan secara formal, sehingga perilaku halus — bagaimana filter ditulis, bagaimana gabungan dan fungsi akar bekerja, bagaimana nilai yang tidak ada dibandingkan — berbeda di antara pustaka. RFC 9535, yang dipublikasikan oleh IETF pada Februari 2024, adalah spesifikasi formal pertama JSONPath. Ia menetapkan tata bahasa yang presisi, mendefinisikan path ternormalisasi untuk hasil, dan menambahkan fungsi standar (length, count, match, search, value). Keduanya mirip tetapi tidak identik: RFC 9535 lebih ketat tentang spasi dan penggunaan tanda kutip dalam filter, mendefinisikan semantik perbandingan untuk anggota yang hilang, dan menolak beberapa konstruksi longgar yang ditoleransi dialek klasik. Alat ini menggunakan mesin RFC 9535 secara default (implementasi tanpa dependensi, tanpa eval) dan memungkinkan Anda beralih ke mesin Klasik (Goessner) untuk kompatibilitas mundur.
Mengapa ekspresi yang sama mengembalikan hasil berbeda di kedua mesin, dan bagaimana cara saya menggunakan ekspresi yang disalin dari jsonpath.com?
Karena RFC 9535 dan dialek Goessner klasik benar-benar memiliki aturan yang berbeda dalam kasus tepi — spasi dan tanda kutip filter, urutan gabungan, bagaimana anggota yang hilang dibandingkan, dan fungsi mana yang ada. Ekspresi yang ditulis untuk satu mesin dapat cocok secara berbeda (atau gagal diurai) di mesin lain. Jika Anda menyalin ekspresi dari alat yang lebih lama seperti jsonpath.com, jsonpath-plus, atau layanan berbasis Jayway, beralihlah toggle mesin di bagian atas ke Klasik (Goessner): mode itu menjalankan evaluator yang kompatibel dengan Goessner (dibangun di atas jsonpath-plus, dikonstruksi dengan eval dinonaktifkan) dan akan mereproduksi perilaku yang Anda lihat di alat sumber. Jika Anda menulis ekspresi baru atau menargetkan sistem yang mengiklankan kepatuhan RFC 9535, pertahankan mesin RFC 9535 default. Lembar contekan dan contoh bawaan ditulis untuk dievaluasi secara identik di kedua mesin sehingga Anda memiliki titik awal yang dikenal-baik.
Bagaimana ekspresi filter [?()] bekerja?
Selektor filter hanya menyimpan elemen larik (atau anggota objek) yang predikatnya bernilai benar. Di dalam filter, @ merujuk pada elemen saat ini yang sedang diuji. $.store.book[?(@.price < 10)] mengembalikan setiap buku yang anggota price-nya kurang dari 10. Anda dapat membandingkan terhadap literal (@.isbn, @.category == 'fiction'), menggabungkan kondisi dengan && dan ||, menguji keberadaan suatu anggota (@.isbn memilih elemen yang memiliki isbn sama sekali), dan dalam RFC 9535 menggunakan ekstensi fungsi di dalam predikat (?(length(@.tags) > 2)). Operator perbandingan adalah ==, !=, <, <=, >, >=. RFC 9535 presisi tentang tipe: membandingkan anggota yang hilang dengan suatu nilai terdefinisi dengan baik dan tidak melempar kesalahan. Dialek klasik lebih longgar tentang spasi, sehingga [?(@.price<10)] dan [?(@.price < 10)] keduanya diterima di sana; RFC 9535 mengikuti tata bahasanya secara persis.
Apa yang dilakukan penurunan rekursif (..)?
Operator .. mencari setiap tingkat dokumen, bukan hanya anak langsungnya. $..author mengumpulkan setiap anggota author di mana pun ia muncul — di dalam objek tingkat atas, di dalam larik, di dalam objek tersarang, pada kedalaman berapa pun. Ia adalah cara tercepat untuk mengekstrak bidang dari struktur yang tersarang dalam atau berbentuk tidak beraturan ketika Anda tidak ingin (atau tidak dapat) mengeja path lengkap. Anda dapat mengikuti .. dengan selektor apa pun: $..book[*] menemukan setiap elemen dari setiap larik book di mana pun dalam pohon, $..* menghitung setiap nilai dalam dokumen, dan $..['price'] mengumpulkan semua anggota price. Penurunan rekursif dapat mencocokkan banyak hal — beralihlah ke tampilan Paths untuk melihat persis dari mana setiap hasil berasal melalui path ternormalisasinya.
Apa itu fungsi RFC 9535 length(), count(), match(), search(), dan value()?
RFC 9535 mendefinisikan lima ekstensi fungsi standar, dan aturan kuncinya adalah bahwa fungsi-fungsi itu hanya dapat dipanggil di dalam ekspresi filter [?...] — tidak pernah sebagai segmen path mandiri. Menulis $.store.book.length() tidak valid RFC 9535 dan tata bahasa standar menolaknya (bentuk pemanggilan-segmen itu adalah ekstensi jsonpath-plus, bukan bagian dari spesifikasi). length() mengembalikan panjang string, larik, atau objek, sehingga Anda menggunakannya untuk menyaring berdasarkan ukuran: $.store.book[?length(@.title) > 15] menyimpan buku yang judulnya lebih panjang dari 15 karakter. count() mengembalikan jumlah node yang dimuat oleh sebuah nodelist, lagi di dalam filter: $.store.book[?(count(@.authors) > 1)]. match() menguji apakah string cocok dengan ekspresi reguler terhadap seluruh nilai, dan search() menguji kecocokan di mana saja dalam string — keduanya mengambil pola I-Regexp. value() mengonversi nodelist node-tunggal menjadi nilainya sehingga dapat digunakan dalam perbandingan. Fungsi-fungsi ini adalah bagian dari standar RFC 9535, sehingga tersedia di mesin default; mesin Klasik (Goessner) tidak mengimplementasikannya. Jika ekspresi berbasis fungsi gagal, pastikan Anda memanggilnya di dalam filter dan bahwa toggle mesin disetel ke RFC 9535.
Bagaimana irisan larik [start:end:step] bekerja?
Irisan menggunakan konvensi setengah-terbuka yang sama seperti Python dan JavaScript: [start:end] memilih dari indeks start hingga tetapi tidak termasuk indeks end, sehingga [0:2] mengembalikan dua elemen pertama (indeks 0 dan 1). Hilangkan sebuah batas untuk berjalan sampai tepi — [2:] dari indeks 2 dan seterusnya, [:3] untuk tiga pertama. Indeks negatif menghitung dari akhir: [-1:] memilih elemen terakhir. Bidang ketiga opsional adalah langkah — [::2] mengambil setiap elemen kedua, [::-1] membalik (di mesin yang mendukung langkah negatif). Batas akhir eksklusif adalah bug irisan paling umum tunggal; tampilan Paths menunjukkan indeks persis dari setiap elemen yang dipilih sehingga Anda dapat mengonfirmasi batasnya sekilas.
Apa itu selektor gabungan dan bagaimana cara memilih beberapa kunci sekaligus?
Selektor gabungan mendaftarkan beberapa nama atau indeks di dalam satu tanda kurung dan mengumpulkan semuanya: $['title','author'] memilih kedua anggota dari sebuah objek, dan $.store.book[0,2] memilih elemen pertama dan ketiga dari larik book. Anda dapat mencampurnya dengan selektor lain — $.store.book[*]['title','price'] menarik title dan price dari setiap buku. Gabungan berguna saat Anda menginginkan proyeksi tetap dari beberapa bidang alih-alih seluruh objek atau wildcard. Tampilan Both adalah cara terjelas untuk membaca hasil gabungan karena ia memasangkan setiap nilai yang dipilih dengan path ternormalisasinya, sehingga Anda dapat mengetahui nama atau indeks mana yang menghasilkan setiap entri.
Bisakah saya membagikan kueri JSONPath dan JSON-nya melalui tautan?
Ya — dan tautan itu tidak melibatkan perjalanan bolak-balik ke server. Klik Salin tautan di bilah aksi: penguji mengodekan JSON, ekspresi, mesin aktif, dan tampilan hasil ke dalam hash URL. Siapa pun yang membuka tautan itu menghidrasi halaman dengan keadaan yang sama, secara lokal di mesin mereka sendiri. Karena data berada dalam fragmen hash, ia tidak pernah dikirimkan ke server go-tools.org — browser tidak mengirim fragmen dalam permintaan HTTP — dan ia tidak pernah muncul dalam log akses kami. Panjang tautan bertambah seiring ukuran JSON, jadi untuk dokumen besar bagikan saja ekspresinya dan biarkan penerima menempel data mereka sendiri, atau gunakan tombol Unggah untuk memuat berkas secara lokal. Ini membuat tautan permanen aman untuk debugging kolaboratif tanpa mengekspos payload ke backend mana pun.
Apakah ada ukuran JSON maksimum?
Evaluasi dibatasi oleh memori browser Anda alih-alih batas keras, tetapi titik manis praktisnya adalah dokumen hingga beberapa megabita — jauh lebih besar dari hampir semua respons API tunggal. Larik yang sangat besar dengan selektor luas (wildcard rekursif $..* atas puluhan ribu node) akan menghasilkan kumpulan hasil besar yang lebih lama dirender; persempit ekspresi agar keluaran tetap terbaca. Tombol Unggah membaca berkas .json atau .txt sepenuhnya di browser (tidak pernah dikirim ke mana pun), dan Format JSON mengindentasi ulang masukan agar Anda dapat membaca strukturnya sebelum mengkuerinya. Untuk pipeline data multi-megabita, validasi ekspresi Anda di sini terhadap potongan representatif, lalu jalankan path yang sama di kode aplikasi Anda atau di alat CLI seperti jq.
Bagaimana ini berbeda dari jsonpath.com dan apakah aman — tanpa eval?
Empat perbedaan. (1) Privasi: jsonpath.com dan sebagian besar evaluator online berjalan di server atau menyematkan pustaka yang mengevaluasi filter dengan JavaScript eval; alat ini berjalan sepenuhnya di browser Anda dan tidak menggunakan eval sama sekali. Mesin RFC 9535 default adalah implementasi tanpa dependensi tanpa jalur eval, dan mesin Klasik (Goessner) dibangun di atas jsonpath-plus yang disematkan ke rilis yang ditambal dengan eval dinonaktifkan secara eksplisit — menutup kelas bug eksekusi kode jarak jauh yang dilacak sebagai CVE-2024-21534 dan CVE-2025-1302. Itu juga berarti alat ini bekerja di bawah Content-Security-Policy yang ketat. (2) Standar: ini adalah salah satu dari sedikit penguji online yang menawarkan mesin RFC 9535 sejati, bukan hanya dialek Goessner lawas. (3) Mesin ganda: Anda dapat beralih antara RFC 9535 dan Klasik untuk membandingkan hasil atau menjalankan ekspresi yang disalin dari alat lebih lama, berdampingan. (4) Bahasa: antarmuka tersedia dalam 15 bahasa. Jika Anda hanya membutuhkan pemeriksaan sintaks lawas cepat, jsonpath.com masih berfungsi; untuk evaluasi yang sesuai standar, privat, dan tanpa eval, ini adalah pilihan yang lebih aman.
Apa yang ditampilkan tampilan Values, Paths, dan Both?
Hasil dari kueri JSONPath adalah nodelist — sekumpulan node di dalam dokumen Anda. Tampilan Values merender node-node itu sebagai larik JSON dari nilai yang cocok, persis apa yang akan Anda konsumsi dalam kode. Tampilan Paths merender path ternormalisasi dari setiap kecocokan sebagai gantinya — lokasi kanonis berkurung-kutip seperti $['store']['book'][0]['title'] yang secara unik mengidentifikasi di mana dalam dokumen nilai itu berada, terlepas dari bagaimana ekspresi Anda ditulis. Path ternormalisasi adalah konsep RFC 9535 dan sangat berharga untuk debugging: dua ekspresi berbeda yang memilih node yang sama menghasilkan path ternormalisasi yang sama. Tampilan Both menunjukkan keduanya berdampingan sehingga Anda dapat mencocokkan setiap nilai dengan lokasinya sekilas. Tampilan yang Anda pilih bertahan lintas sesi melalui localStorage.
Apakah ini bekerja offline, dan bagaimana dengan Content-Security-Policy?
Ya untuk keduanya. Karena setiap evaluasi berjalan di browser Anda tanpa panggilan jaringan, alat ini tetap berfungsi setelah halaman dimuat bahkan jika Anda offline. Dan karena tidak ada mesin yang menggunakan eval atau konstruktor Function untuk mengevaluasi ekspresi filter, alat ini berjalan di bawah Content-Security-Policy ketat yang melarang unsafe-eval — kebijakan yang ditegakkan banyak organisasi yang sadar-keamanan dan yang merusak pustaka JSONPath berbasis eval. Mesin RFC 9535 mengurai dan menafsirkan ekspresi dengan tata bahasanya sendiri alih-alih mengompilasinya ke JavaScript, dan mesin Klasik dikonfigurasi dengan eval dinonaktifkan. Jika Anda perlu mengevaluasi JSONPath di dalam lingkungan internal yang diperkeras, alat ini dirancang untuk berjalan di sana tanpa pengecualian kebijakan.