Panduan Kueri JSONPath: Mengekstrak Data Seperti Profesional
JSONPath adalah bahasa kueri untuk JSON, mirip dengan cara kerja XPath untuk XML. Ketika Anda berurusan dengan respons API yang kompleks dan bersarang dalam, JSONPath memungkinkan Anda mengekstrak tepat data yang Anda butuhkan tanpa menulis loop dan kondisional. Panduan ini mencakup sintaks, operator, dan pola dunia nyata yang Anda perlukan.
Mengapa JSONPath?
Perhatikan respons API tipikal dengan data bersarang:
{
"store": {
"books": [
{ "title": "Clean Code", "author": "Robert Martin", "price": 32.99, "tags": ["programming", "best-practices"] },
{ "title": "Design Patterns", "author": "Gang of Four", "price": 44.99, "tags": ["programming", "architecture"] },
{ "title": "The Pragmatic Programmer", "author": "Hunt & Thomas", "price": 39.99, "tags": ["programming", "career"] }
],
"music": [
{ "title": "Kind of Blue", "artist": "Miles Davis", "price": 12.99 }
]
}
}
Untuk mendapatkan semua judul buku, Anda bisa menulis loop — atau menggunakan JSONPath: $.store.books[*].title
Sintaks Dasar
| Ekspresi | Deskripsi |
|---|---|
$ | Objek root |
. | Operator anak |
.. | Penelusuran rekursif (cari semua level) |
[*] | Wildcard (semua elemen) |
[n] | Indeks array (berbasis 0) |
[n,m] | Beberapa indeks |
[start:end:step] | Slice array |
[?()] | Ekspresi filter |
@ | Elemen saat ini (dalam filter) |
Notasi Titik vs Notasi Bracket
Kedua notasi mengakses properti, tetapi notasi bracket diperlukan untuk karakter khusus:
# Notasi titik
$.store.books[0].title
# Notasi bracket (setara)
$['store']['books'][0]['title']
# Diperlukan untuk kunci dengan karakter khusus
$['store']['price-range']
Operasi Array
Pengindeksan
$.store.books[0] # Buku pertama
$.store.books[-1] # Buku terakhir
$.store.books[0,2] # Buku pertama dan ketiga
Slicing
$.store.books[0:2] # Dua buku pertama (indeks 0 dan 1)
$.store.books[1:] # Semua buku kecuali yang pertama
$.store.books[:2] # Dua buku pertama
$.store.books[::2] # Setiap buku kedua
Wildcard
$.store.books[*].title # Semua judul buku
$.store.* # Semua koleksi toko (books, music)
$..title # Semua judul di kedalaman mana pun
$..price # Semua harga di kedalaman mana pun
Operator penelusuran rekursif (..) sangat powerful untuk mengekstrak nilai terlepas dari posisinya dalam hierarki.
Ekspresi Filter
Filter memilih elemen berdasarkan kondisi:
# Buku dengan harga di bawah $40
$.store.books[?(@.price < 40)]
# Buku oleh penulis tertentu
$.store.books[?(@.author == 'Robert Martin')]
# Buku dengan lebih dari 2 tag
$.store.books[?(@.tags.length > 2)]
# Buku yang memiliki properti 'price'
$.store.books[?(@.price)]
Menggabungkan Filter
# Buku di bawah $40 dengan tag programming
$.store.books[?(@.price < 40 && @.tags[0] == 'programming')]
Contoh Dunia Nyata
Mengekstrak dari Respons API
GitHub API — mendapatkan semua nama repository:
$[*].name
Weather API — mendapatkan suhu hari ini:
$.daily[0].temp.day
E-commerce API — mendapatkan semua gambar produk:
$.products[*].images[0].url
Ekstraksi Konfigurasi
Docker Compose — mendapatkan semua nama service:
$.services.*~
Package.json — mendapatkan semua nama dependency:
$.dependencies.*~
JSONPath vs jq
JSONPath dan jq keduanya merupakan alat kueri JSON, tetapi digunakan dalam konteks yang berbeda:
| Fitur | JSONPath | jq |
|---|---|---|
| Lingkungan | Library, API | Command line |
| Sintaks | Terinspirasi XPath | Fungsional kustom |
| Transformasi | Hanya kueri | Kueri + transformasi |
| Standar | RFC 9535 | Standar de facto |
Untuk pemrosesan JSON di command line, jq lebih powerful. Untuk menyematkan kueri dalam aplikasi atau menggunakan di alat web, JSONPath lebih banyak didukung.
Coba ekspresi JSONPath secara interaktif dengan JSON Path Explorer kami. Tempel JSON Anda, tulis kueri, dan lihat hasilnya secara instan.
Contoh Implementasi
JavaScript (jsonpath-plus)
const { JSONPath } = require('jsonpath-plus');
const result = JSONPath({
path: '$.store.books[?(@.price < 40)].title',
json: data
});
// ["Clean Code", "The Pragmatic Programmer"]
Python (jsonpath-ng)
from jsonpath_ng import parse
expr = parse('$.store.books[*].title')
titles = [match.value for match in expr.find(data)]
RFC 9535: Standar JSONPath
Pada Februari 2024, JSONPath secara resmi distandarisasi sebagai RFC 9535. Ini mengatasi inkonsistensi historis antar implementasi. Perilaku utama yang distandarisasi:
- Indeks array berbasis 0
- Ekspresi filter menggunakan
@untuk elemen saat ini - Perbandingan string bersifat case-sensitive
- Hasilnya selalu berupa array dari nilai yang cocok
Jika Anda memilih library JSONPath, pilih yang mendukung RFC 9535 untuk perilaku yang konsisten.
FAQ
Apa perbedaan antara JSONPath dan JSON Pointer?
JSONPath adalah bahasa kueri yang dapat mencocokkan beberapa nilai menggunakan wildcard dan filter. JSON Pointer (RFC 6901) adalah sintaks path sederhana yang menunjuk tepat satu nilai: /store/books/0/title. Gunakan JSONPath saat Anda perlu mencari atau memfilter; gunakan JSON Pointer saat Anda mengetahui path yang tepat.
Bisakah JSONPath memodifikasi data JSON?
JSONPath standar bersifat read-only — mengekstrak tetapi tidak memodifikasi data. Beberapa library memperluas JSONPath dengan operasi set/delete, tetapi ini bukan standar. Untuk transformasi, pertimbangkan jq (command line) atau tulis kode aplikasi. Untuk melihat dan menjelajahi struktur JSON, JSON Formatter kami membantu Anda memahami data sebelum menulis kueri.
Sumber Terkait
- JSON Path Explorer — Uji ekspresi JSONPath di browser Anda
- Praktik Terbaik Pemformatan JSON — Susun JSON Anda untuk kueri yang lebih mudah
- Panduan Validasi JSON Schema — Validasi struktur yang diharapkan kueri JSONPath Anda