Logo Universitas Teknokrat Indonesia

Bukan Sekadar Filter: 7 Resep jq Canggih untuk Mengolah Data JSON Seperti Profesional

Kategori: jq.
Gambar untuk Bukan Sekadar Filter: 7 Resep jq Canggih untuk Mengolah Data JSON Seperti Profesional

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:

  1. map({(.id): .}): map akan mengiterasi setiap elemen dalam array. Di dalamnya, kita membuat objek baru. Sintaks (.id) mengevaluasi nilai dari field id dan menggunakannya sebagai key objek. Tanda . di sisi kanan merepresentasikan seluruh objek pengguna itu sendiri sebagai value. Ini menghasilkan array baru: [ { "user-101": {...} }, { "user-102": {...} }, ... ].
  2. | add: Perintah add memiliki 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:

  1. 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..}, ... ] ].
  2. | map(...): Kita kemudian memetakan setiap grup (array internal) ke format output yang kita inginkan.
  3. 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.
  4. count: length: length adalah 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:

  1. jq --slurp '...' users.json profiles.json: --slurp membaca semua file input dan memasukkannya ke dalam satu array besar. Jadi, . sekarang adalah [ [..users..], [..profiles..] ].
  2. .[0] as $users | .[1] as $profiles: Kita menyimpan array pengguna ke variabel $users dan array profil ke variabel $profiles.
  3. $users | map(...): Kita mulai dengan mengiterasi setiap pengguna di $users.
  4. . + (...): Operator + pada objek berarti menggabungkan (merge). Kita akan menggabungkan objek pengguna (.) dengan hasil dari ekspresi di dalam kurung.
  5. $profiles | map(select(.userId == .id)): Di sini terjadi keajaiban. Untuk setiap pengguna, kita mencari di dalam $profiles sebuah objek yang userId-nya sama dengan id pengguna saat ini. Hasilnya adalah array berisi profil yang cocok (atau kosong).
  6. | .[0] // {}: Kita ambil elemen pertama dari hasil pencarian (.[0]). Jika tidak ada yang cocok (hasilnya array kosong), .[0] akan menghasilkan null. Operator // {} adalah penyelamat: jika nilai di kirinya null, 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:

  1. (...) | @csv: Format @csv adalah built-in formatter yang mengubah array menjadi baris CSV yang valid (menangani koma dan tanda kutip secara otomatis).
  2. 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.
  3. (.[] | [.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.
  4. ,: Koma di antara dua blok dalam kurung berfungsi untuk menggabungkan output stream keduanya. Jadi, jq pertama-tama mengeluarkan header, lalu mengeluarkan baris-baris data, yang kemudian semuanya di-pipe ke @csv.
  5. -r: Flag -r (raw output) sangat penting di sini untuk menghapus tanda kutip di sekitar setiap baris CSV.

Baca juga: Mendiktisaintek Brian Yuliarto Apresiasi Tinggi Digital Smart Composter Karya Universitas Teknokrat Indonesia


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