jq seringkali dikenal sebagai alat untuk memformat (pretty-print) atau memfilter nilai sederhana dari JSON. Namun, kemampuannya jauh melampaui itu. Bagi para profesional yang setiap hari bergelut dengan data di command-line, jq adalah pisau Swiss Army yang tajam untuk melakukan transformasi data yang rumit, menggabungkan sumber, dan bahkan menerapkan logika kondisional—semuanya dalam satu baris perintah yang elegan.
Jika Anda sudah nyaman dengan .field dan select(), saatnya naik level. Artikel ini menyajikan 7 "resep" jq canggih yang akan mengubah cara Anda melihat dan mengolah data JSON. Resep-resep ini adalah trik dari para praktisi yang akan menyelesaikan masalah dunia nyata dengan cepat dan efisien, tanpa perlu menulis skrip Python atau JavaScript.
Baca juga: Membongkar Rahasia GDScript: Mengapa Sintaksis Sederhana Mampu Menciptakan Dunia Game Kompleks?
Resep 1: Mengubah Array Menjadi Objek (Grouping Data)
Seringkali kita mendapatkan data dalam bentuk array datar, padahal untuk pemrosesan lebih lanjut, kita membutuhkannya dalam bentuk objek atau hash map untuk pencarian cepat. jq bisa melakukan ini dengan brilian.
Skenario: Anda memiliki daftar pengguna dalam bentuk array, dan Anda ingin mengubahnya menjadi objek di mana key-nya adalah id pengguna untuk akses instan.
Data Input (users.json):
JSON
[
{"id": "user-101", "name": "Andi", "role": "admin"},
{"id": "user-102", "name": "Budi", "role": "editor"},
{"id": "user-103", "name": "Citra", "role": "viewer"}
]
Resep jq:
Bash
cat users.json | jq 'map({(.id): .}) | add'
Hasil:
JSON
{
"user-101": { "id": "user-101", "name": "Andi", "role": "admin" },
"user-102": { "id": "user-102", "name": "Budi", "role": "editor" },
"user-103": { "id": "user-103", "name": "Citra", "role": "viewer" }
}
🧠 Cara Kerjanya:
map({(.id): .}):mapakan mengiterasi setiap elemen dalam array. Di dalamnya, kita membuat objek baru. Sintaks(.id)mengevaluasi nilai dari fieldiddan menggunakannya sebagai key objek. Tanda.di sisi kanan merepresentasikan seluruh objek pengguna itu sendiri sebagai value. Ini menghasilkan array baru:[ { "user-101": {...} }, { "user-102": {...} }, ... ].| add: Perintahaddmemiliki fungsi spesial: jika diaplikasikan pada array berisi objek-objek, ia akan menggabungkan semua objek tersebut menjadi satu.
Resep 2: Menghitung Frekuensi atau Agregasi Data
jq tidak hanya bisa menampilkan data, tapi juga melakukan kalkulasi. Menghitung berapa kali nilai tertentu muncul adalah tugas analisis data yang sangat umum.
Skenario: Anda memiliki log transaksi dan ingin menghitung berapa banyak transaksi yang terjadi di setiap kota.
Data Input (transactions.json):
JSON
[
{"id": 1, "city": "Jakarta"},
{"id": 2, "city": "Bandung"},
{"id": 3, "city": "Jakarta"},
{"id": 4, "city": "Surabaya"},
{"id": 5, "city": "Bandung"},
{"id": 6, "city": "Jakarta"}
]
Resep jq:
Bash
cat transactions.json | jq 'group_by(.city) | map({city: .[0].city, count: length})'
Hasil:
JSON
[
{ "city": "Bandung", "count": 2 },
{ "city": "Jakarta", "count": 3 },
{ "city": "Surabaya", "count": 1 }
]
🧠 Cara Kerjanya:
group_by(.city): Fungsi ini adalah bintang utamanya. Ia akan mengelompokkan semua objek dalam array berdasarkan nilai dari.city, menghasilkan array bersarang:[ [ {..Jakarta..}, {..Jakarta..} ], [ {..Bandung..}, ... ] ].| map(...): Kita kemudian memetakan setiap grup (array internal) ke format output yang kita inginkan.city: .[0].city: Untuk setiap grup, kita ambil nama kotanya dari elemen pertama (.[0].city). Karena semua elemen dalam grup punya kota yang sama, kita cukup ambil dari yang pertama.count: length:lengthadalah fungsi yang sangat berguna. Jika diterapkan pada array, ia akan mengembalikan jumlah elemen di dalamnya.
Resep 3: Menggabungkan Data dari Dua File JSON
Ini adalah tugas super canggih yang seringkali membutuhkan skrip khusus. jq bisa melakukannya dengan flag --slurp dan --argfile.
Skenario: Anda punya data pengguna (users.json dari Resep 1) dan data tambahan berisi detail profil (profiles.json). Anda ingin menggabungkan keduanya menjadi satu struktur data yang kaya.
Data Input 2 (profiles.json):
JSON
[
{"userId": "user-101", "lastLogin": "2025-08-26"},
{"userId": "user-102", "lastLogin": "2025-08-27"}
]
Resep jq:
Bash
jq --slurp '
.[0] as $users | .[1] as $profiles |
$users | map(. + ($profiles | map(select(.userId == .id)) | .[0] // {}))
' users.json profiles.json
Hasil:
JSON
[
{ "id": "user-101", "name": "Andi", "role": "admin", "userId": "user-101", "lastLogin": "2025-08-26" },
{ "id": "user-102", "name": "Budi", "role": "editor", "userId": "user-102", "lastLogin": "2025-08-27" },
{ "id": "user-103", "name": "Citra", "role": "viewer" }
]
🧠 Cara Kerjanya:
jq --slurp '...' users.json profiles.json:--slurpmembaca semua file input dan memasukkannya ke dalam satu array besar. Jadi,.sekarang adalah[ [..users..], [..profiles..] ]..[0] as $users | .[1] as $profiles: Kita menyimpan array pengguna ke variabel$usersdan array profil ke variabel$profiles.$users | map(...): Kita mulai dengan mengiterasi setiap pengguna di$users.. + (...): Operator+pada objek berarti menggabungkan (merge). Kita akan menggabungkan objek pengguna (.) dengan hasil dari ekspresi di dalam kurung.$profiles | map(select(.userId == .id)): Di sini terjadi keajaiban. Untuk setiap pengguna, kita mencari di dalam$profilessebuah objek yanguserId-nya sama denganidpengguna saat ini. Hasilnya adalah array berisi profil yang cocok (atau kosong).| .[0] // {}: Kita ambil elemen pertama dari hasil pencarian (.[0]). Jika tidak ada yang cocok (hasilnya array kosong),.[0]akan menghasilkannull. Operator// {}adalah penyelamat: jika nilai di kirinyanull, gunakan nilai di kanannya (objek kosong). Ini mencegah error dan memastikan penggabungan tetap berjalan.
Resep 4: Meratakan Struktur JSON Bersarang (Flatten)
API seringkali mengembalikan objek JSON yang bersarang dalam. Untuk analisis atau impor ke CSV, kita perlu meratakannya.
Skenario: Anda mendapatkan data pesanan dengan detail pembeli di dalam objek customer.
Data Input (order.json):
JSON
{
"orderId": "ORD-987",
"amount": 250000,
"customer": {
"name": "Dewi",
"address": {
"city": "Bandar Lampung"
}
}
}
Resep jq:
Bash
cat order.json | jq '{orderId, amount, customerName: .customer.name, city: .customer.address.city}'
Hasil:
JSON
{
"orderId": "ORD-987",
"amount": 250000,
"customerName": "Dewi",
"city": "Bandar Lampung"
}
🧠 Cara Kerjanya: Ini adalah trik sintaksis yang sangat berguna. Saat membuat objek baru, jika nama key baru sama dengan nama key di input, Anda cukup menuliskannya sekali (seperti orderId). Jika Anda ingin menamainya ulang atau mengakses path yang dalam, Anda menggunakan format newKey: .path.to.value.
Resep 5: Logika Kondisional dengan if-then-else
Ya, Anda bisa menulis if-then-else di jq untuk transformasi yang lebih cerdas.
Skenario: Anda ingin menambahkan field status baru berdasarkan nilai field yang ada.
Data Input (servers.json):
JSON
[
{"name": "web-01", "load": 0.85},
{"name": "db-01", "load": 0.45},
{"name": "cache-01", "load": 0.92}
]
Resep jq:
Bash
cat servers.json | jq 'map(. + {status: if .load > 0.8 then "critical" else "normal" end})'
Hasil:
JSON
[
{ "name": "web-01", "load": 0.85, "status": "critical" },
{ "name": "db-01", "load": 0.45, "status": "normal" },
{ "name": "cache-01", "load": 0.92, "status": "critical" }
]
🧠 Cara Kerjanya: Strukturnya sangat intuitif. map(. + { ... }) akan menambahkan field baru ke setiap objek. Nilai dari field status ditentukan oleh blok if .load > 0.8 then "critical" else "normal" end.
Resep 6: Menghapus Key dari Objek
Terkadang, Anda perlu membersihkan data sensitif atau tidak relevan sebelum meneruskannya ke layanan lain.
Skenario: Anda ingin menampilkan data pengguna tetapi menghapus informasi sessionToken.
Data Input (session.json):
JSON
{
"username": "eko",
"email": "eko@example.com",
"sessionToken": "a1b2c3d4e5f6g7h8",
"lastLogin": "10:50 AM"
}
Resep jq:
Bash
cat session.json | jq 'del(.sessionToken)'
Hasil:
JSON
{
"username": "eko",
"email": "eko@example.com",
"lastLogin": "10:50 AM"
}
🧠 Cara Kerjanya: Fungsi del(.path.to.key) adalah cara paling langsung dan mudah dibaca untuk menghapus key-value pair dari sebuah objek.
Resep 7: Membuat CSV dari JSON
Ini adalah salah satu resep paling praktis. Mengubah output JSON menjadi CSV (Comma-Separated Values) untuk diimpor ke spreadsheet atau tool lain.
Skenario: Anda ingin mengubah data pengguna dari Resep 1 menjadi format CSV.
Data Input (users.json):
JSON
[
{"id": "user-101", "name": "Andi", "role": "admin"},
{"id": "user-102", "name": "Budi", "role": "editor"},
{"id": "user-103", "name": "Citra", "role": "viewer"}
]
Resep jq:
Bash
cat users.json | jq -r '(map(keys) | .[0]), (.[] | [.id, .name, .role]) | @csv'
Hasil:
Code snippet
"id","name","role"
"user-101","Andi","admin"
"user-102","Budi","editor"
"user-103","Citra","viewer"
🧠 Cara Kerjanya:
(...) | @csv: Format@csvadalah built-in formatter yang mengubah array menjadi baris CSV yang valid (menangani koma dan tanda kutip secara otomatis).map(keys) | .[0]: Bagian pertama ini membuat baris header.map(keys)menghasilkan[["id","name","role"], ["id","name","role"], ...]. Kita hanya perlu satu, jadi.[0]mengambil header pertama.(.[] | [.id, .name, .role]): Bagian kedua ini memproses datanya..[]mengiterasi setiap pengguna. Untuk setiap pengguna,[.id, .name, .role]membuat array dari nilai-nilai yang kita inginkan.,: Koma di antara dua blok dalam kurung berfungsi untuk menggabungkan output stream keduanya. Jadi,jqpertama-tama mengeluarkan header, lalu mengeluarkan baris-baris data, yang kemudian semuanya di-pipe ke@csv.-r: Flag-r(raw output) sangat penting di sini untuk menghapus tanda kutip di sekitar setiap baris CSV.
Kesimpulan: Lebih dari Sekadar Alat, Ini Adalah Keahlian
Menguasai resep-resep jq canggih ini akan secara fundamental meningkatkan efisiensi Anda di command-line. Anda akan dapat memecahkan masalah pengolahan data yang rumit dalam hitungan detik, yang sebelumnya mungkin membutuhkan waktu berjam-jam untuk menulis skrip. jq bukan lagi sekadar filter, melainkan sebuah bahasa pemrograman fungsional mini yang kuat untuk data JSON. Simpan resep ini, latih, dan bersiaplah untuk mengolah data seperti seorang profesional.
Penulis: Eka sri indah lestary