Pengekstrak Jalur JSON
Tempel JSON dan masukkan ekspresi path seperti $.store.book[0].title untuk mengekstrak nilai.
Hasil
Cara kerjanya
- Tempel JSON Anda: masukkan objek atau array JSON di kolom input.
- Masukkan ekspresi JSONPath: ketik path seperti $.store.book[*].author atau $.users[?(@.age > 18)] untuk memilih data yang Anda inginkan.
- Lihat hasil yang diekstrak: nilai yang cocok muncul seketika di panel keluaran. Salin hasilnya atau ekspor.
Mengapa menggunakan ekstraktor JSONPath?
Saat bekerja dengan respons API yang kompleks atau JSON yang bersarang dalam, mengekstrak nilai tertentu secara manual lambat dan rentan kesalahan. JSONPath adalah bahasa kueri untuk JSON, mirip dengan XPath untuk XML. Memungkinkan Anda menargetkan persis data yang Anda butuhkan menggunakan ekspresi path yang ringkas, baik itu nilai bersarang tunggal, semua elemen array, atau catatan yang difilter sesuai kondisi. Alat ini membuat eksplorasi JSONPath interaktif tanpa menulis kode.
Fitur
- Dukungan JSONPath lengkap: notasi titik, notasi tanda kurung, wildcard (*), descent rekursif (..), filter (?()), dan slice array.
- Evaluasi langsung: hasil diperbarui saat Anda mengetik ekspresi JSONPath.
- Keluaran terformat: nilai yang diekstrak ditampilkan sebagai JSON yang diformat dengan indah.
- Beberapa kecocokan: mengembalikan semua node yang cocok dari dokumen JSON.
- Pelaporan kesalahan: pesan jelas saat ekspresi path tidak valid atau tidak menghasilkan kecocokan.
Pertanyaan umum
Apa itu JSONPath?
JSONPath adalah bahasa kueri untuk dokumen JSON, analog dengan XPath untuk XML. Path seperti $.users[*].name memilih kolom name dari setiap objek dalam array users. Banyak digunakan untuk pengujian API, transformasi data, dan pemrosesan JSON.
Bagaimana cara memfilter elemen array berdasarkan kondisi?
Gunakan ekspresi filter: $.items[?(@.price < 50)] mengembalikan semua item yang harganya kurang dari 50. Simbol @ merujuk pada elemen yang sedang dievaluasi.
Apakah mendukung pencarian rekursif?
Ya. Operator .. melakukan pencarian rekursif di semua tingkat. Misalnya, $..name menemukan semua kunci name di mana saja dalam struktur JSON, terlepas dari kedalaman bersarang.
Dari posting blog ke RFC 9535: jalan 17 tahun menuju standar JSONPath
Stefan Gössner mengusulkan JSONPath dalam satu posting blog pada Februari 2007, mengadaptasi ide XPath ke JSON. Ia menerbitkan implementasi referensi JavaScript, menyketsa sintaksis (akar $, operator anak titik dan kurung, .. untuk turunan rekursif, * untuk wildcard, [mulai:akhir:langkah] untuk slicing array, [?(...)] untuk ekspresi filter) dan ekosistem yang lebih luas mengikuti. Implementasi berkembang biak: jsonpath untuk JavaScript, JsonPath untuk Java, jq (Stephen Dolan, 2012) yang berdekatan dengan JSONPath tapi merupakan hal sendiri, jsonpath-ng untuk Python, JMESPath (AWS, 2014) sebagai saingan yang lebih ketat. Masalahnya: setiap implementasi melayang. Sintaksis filter, semantik rekursi, pencocokan regex, pengidentifikasi akar, semuanya berbeda secara halus di antara pustaka. Sebuah studi perbandingan 2023 oleh Carsten Bormann et al. menguji 41 implementasi JSONPath yang berbeda terhadap input yang sama dan mendapat 41 set hasil yang berbeda untuk ekspresi yang sama. Kelompok Kerja JSONPath IETF berkumpul pada 2020 untuk memperbaiki ini. RFC 9535 «JSONPath: Query Expressions for JSON» diterbitkan pada Februari 2024, menjadi standar formal pertama untuk JSONPath, 17 tahun setelah posting asli Gössner. RFC 9535 mengkodifikasi sintaksis, mendefinisikan format output yang dinormalkan, memerlukan normalisasi Unicode untuk perbandingan string, dan menambahkan suite uji kesesuaian.
Lembar contekan sintaksis JSONPath
Tujuh operator yang mencakup sebagian besar query dunia nyata:
$akar. Setiap jalur mulai di sini.$sendiri mengembalikan seluruh dokumen..namaanak berdasarkan nama.$.store.bookmemilih bidangbookdi dalamstore. Nama dengan spasi atau karakter khusus memerlukan notasi kurung:$['book title'].[0]indeks array.$.book[0]elemen pertama.$.book[-1]elemen terakhir (penambahan RFC 9535).[mulai:akhir:langkah]slice array. Gaya Python:$.book[1:3]elemen 1 dan 2,$.book[::2]setiap elemen lainnya.langkahdapat negatif untuk membalik.*wildcard.$.book[*].titlejudul setiap buku. Juga berfungsi sebagai wildcard properti:$.store.*semua anak langsung daristore...turunan rekursif.$..titlemenemukan setiap bidangtitledi kedalaman apa pun. Kuat tapi lambat di dokumen besar.[?(...)]ekspresi filter.$.book[?(@.price < 10)]semua buku di mana harga di bawah 10.@berarti «elemen saat ini». RFC 9535 menamakan ini?dan menstandarkan operator perbandingan== != < <= > >=ditambah boolean&& ||. Mode cepat viewer ini tidak mengevaluasi ekspresi filter, gunakan pustaka sepertijsonpath-plusjika Anda membutuhkannya.
Di mana Anda sebenarnya meraih JSONPath
- Penyaringan output kubectl.
kubectl get pods -o jsonpath='{.items[*].metadata.name}'dikirimkan di Kubernetes dan merupakan konsumen JSONPath yang digunakan setiap hari. Varian Kubernetes menjatuhkan$di depan dan memiliki beberapa keunikan yang perlu diperhatikan jika Anda hidup di ekosistem itu. - Pengujian API dengan Postman atau Insomnia. Pernyataan uji seperti
pm.expect(jsonData.items[0].status).to.eql('active')biasanya diekspresikan sebagai JSONPath di balik layar. - Dasbor Grafana / observabilitas. Panel sumber data JSON meminta metrik menggunakan JSONPath; pengumpul OpenTelemetry menggunakan sintaksis mirip JSONPath untuk mengekstrak atribut span.
- Ekstraksi CLI cepat. Pasangkan alat ini dengan
curl | jquntuk eksplorasi API langsung: prototipe jalur di viewer, lalu terjemahkan ke sintaksisjquntuk skrip shell. (jq menggunakan notasi titik tapi tidak ketat JSONPath.) - ETL dan rekayasa data. Pemetaan Airflow XCom, file seed dbt, dan ekstraksi kolom JSON SQL semuanya menggunakan ekspresi mirip JSONPath untuk menjangkau payload bersarang.
- Inspeksi token. Selami JWT yang didekode:
$.payload.issuntuk penerbit,$..roles[*]untuk setiap peran yang diberikan di mana saja di pohon klaim. - Desain handler webhook. Sebelum menulis kode handler, tempel payload webhook nyata dan prototipe jalur yang menarik bidang yang dipedulikan sistem Anda. Menghemat perjalanan bolak-balik dengan layanan hulu.
Kesalahan yang menggigit
- Penyimpangan implementasi. Jalur yang bekerja di satu pustaka dapat menghasilkan hasil yang berbeda, atau tidak ada hasil, di pustaka lain. Sebelum RFC 9535 tidak ada yang distandardisasi. Sekarang cari «sesuai RFC 9535» di dokumen pustaka Anda (suite uji IETF diterbitkan dengan RFC).
- Kutipan filter.
$.book[?(@.title=="Foo")]memerlukan kutipan ganda di dalam filter di RFC 9535; banyak pustaka lama juga menerima kutipan tunggal'Foo'. Mencampurkan keduanya adalah penyebab umum «kesalahan sintaksis» di produksi. - Turunan rekursif rakus.
$..*mengembalikan setiap nilai dalam dokumen, termasuk objek dan array bersarang itu sendiri, bukan hanya daun. Di dokumen besar ini bisa memakan beberapa detik. Persempit jalur terlebih dahulu, baru turun. - Kunci integer vs string. JSON hanya memiliki kunci string, bahkan ketika terlihat numerik.
$.users.123dan$.users[123]berarti hal yang berbeda di beberapa pustaka: yang pertama mencari properti yang secara harfiah bernama"123", yang kedua dapat ditafsirkan sebagai indeks array 123. - Slice negatif.
$.book[-1:]berarti «elemen terakhir» di RFC 9535 dan sebagian besar implementasi, tapi sebelum 2024 beberapa pustaka memperlakukan indeks negatif sebagai kesalahan. Jika Anda menargetkan parser lama, gunakan indeks absolut. - Melupakan
$. Jalur tanpa$di depan tidak valid di RFC 9535. Beberapa implementasi menerima.store.booksebagai singkatan, yang lain menolaknya. Selalu prefiks dengan$. - Kinerja. Turunan rekursif
..pada dokumen 10 MB bisa O(n) per kecocokan. Untuk kolom gudang data atau loop panas, pra-ekstrak sekali dengan$.., cache hasilnya, lalu berjalan melalui array yang di-cache. Jangan pernah menjalankan JSONPath kompleks pada setiap permintaan.
JSONPath vs jq vs JMESPath vs JSON Pointer
- JSONPath (RFC 9535). Terbaik untuk query ad-hoc dan file konfigurasi. Sintaksisnya familiar dari XPath, standarnya segar, beberapa pustaka bahasa mendukungnya.
- jq. Bahasa transformasi data lengkap, bukan hanya query jalur. Menambahkan map/filter/reduce, fungsi string, matematika, pemformatan. Lebih baik ketika Anda perlu membentuk ulang data, bukan hanya mengekstraknya. Memiliki sintaksisnya sendiri dengan notasi titik tapi menyimpang dari JSONPath di tingkat filter.
- JMESPath. Alternatif 2014 yang digunakan oleh AWS CLI (
aws ec2 describe-instances --query "..."). Lebih ketat dan fungsional daripada JSONPath, memiliki tata bahasa nyata dari hari pertama, mendukung proyeksi dan operator pipa. Kurang umum di luar ekosistem Amazon. - JSON Pointer (RFC 6901). Standar 2013 untuk mengalamatkan nilai tunggal:
/store/book/0/title. Tidak dapat melakukan wildcard, filter, atau rekursi. Digunakan oleh JSON Patch (RFC 6902), JSON Schema$ref, dan API patch Kubernetes. Pilih ini ketika Anda memerlukan penunjukan alamat yang tepat, bukan query.
Pertanyaan yang lebih sering diajukan
Apakah JSONPath sama dengan XPath?
Terinspirasi olehnya, tidak identik. XPath difinalkan oleh W3C pada 1999 untuk XML, JSONPath disketsa oleh Gössner pada 2007 untuk membawa ide yang sama ke JSON. Perbedaan terbesar: JSONPath menggunakan . dan [] alih-alih /, JSONPath tidak memiliki konsep ruang nama atau atribut XML, JSONPath distandardisasi jauh kemudian (2024 vs 1999), jadi selama bertahun-tahun itu adalah sintaksis de facto dengan banyak implementasi yang tidak kompatibel.
Mengapa JSONPath yang sama memberi hasil yang berbeda di alat yang berbeda?
Karena JSONPath tidak distandardisasi sampai RFC 9535 (Februari 2024). Sebelum itu, setiap implementasi membuat pilihannya sendiri tentang sintaksis filter, dukungan regex, pengidentifikasi akar, aturan escape, dan kasus tepi (array kosong, kunci yang hilang, paksaan tipe dalam filter). Studi kelompok kerja IETF 2023 menguji 41 implementasi pada input yang sama dan mendapatkan 41 set hasil yang berbeda. RFC 9535 memperbaiki ini untuk pustaka baru dan yang diperbarui; pustaka lama akan menyimpang sampai mereka bermigrasi. Selalu periksa apakah pustaka Anda mengklaim «kesesuaian RFC 9535».
Bisakah saya memodifikasi JSON dengan JSONPath, atau hanya membaca?
RFC 9535 mendefinisikan JSONPath dengan ketat sebagai bahasa query: ia mengembalikan nilai dari dokumen, ia tidak bermutasi. Untuk memodifikasi JSON, gunakan JSON Patch (RFC 6902), yang menggunakan jalur JSON Pointer dan operasi add/remove/replace/copy/move/test. Beberapa pustaka menggabungkan keduanya (mis. jsonpath-plus di JavaScript memiliki ekstensi mutasi apply()) tapi itu bukan JSONPath standar.
Apakah JSONPath mendukung ekspresi reguler dalam filter?
RFC 9535 menambahkan dua fungsi regex: match(node, regex) mencocokkan seluruh string, search(node, regex) mencocokkan substring apa pun. Contoh: $.book[?(match(@.isbn, "^978-"))]. Rasa regex adalah I-Regexp (RFC 9485, profil regex XML Schema), bukan PCRE atau regex JavaScript. Pustaka lama menggunakan rasa regex bahasa host mereka, yang membuat query regex sangat tidak portabel.
Apakah JSON saya dikirim ke mana pun saat saya menggunakan alat ini?
Tidak. Evaluasi jalur berjalan sepenuhnya di mesin JavaScript browser Anda. Buka tab Jaringan di DevTools dan jalankan query, Anda akan melihat nol permintaan keluar selama evaluasi. Aman untuk respons API dengan rahasia, dump database dengan PII, atau file konfigurasi yang berisi kredensial.