alltools.one
JSON
2025-07-04
8 min
alltools.one Team
JSONJSONPathQueryData ExtractionAPI

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

EkspresiDeskripsi
$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:

FiturJSONPathjq
LingkunganLibrary, APICommand line
SintaksTerinspirasi XPathFungsional kustom
TransformasiHanya kueriKueri + transformasi
StandarRFC 9535Standar 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

Published on 2025-07-04
JSONPath Query Guide: Extracting Data Like a Pro | alltools.one