0Pricing
DevOps Bootcamp · Pelajaran

Menyaring dan Memilih JSON dengan Pipeline jq

Navigasikan objek dan array bertingkat menggunakan pemilih, pipe, dan filter select pada jq.

Menyaring dan Memilih JSON dengan Pipeline jq adalah pelajaran DevOps Bootcamp gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar DevOps Bootcamp, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus DevOps Bootcamp mencakup 4 pelajaran total.

Apa Itu jq dan Mengapa Menggunakannya?

jq adalah alat baris perintah yang ringan dan andal untuk mengurai, memfilter, serta mengubah data JSON. jq adalah sed untuk JSON—Anda menyalurkan JSON ke dalamnya dan mendapatkan keluaran terstruktur.

  • Sudah terpasang pada sebagian besar distribusi Linux atau tersedia melalui apt install jq / brew install jq
  • Bekerja mulus dalam alur pemrosesan shell bersama curl, cat, dan alat lainnya
  • Mendukung pemfilteran, pemetaan, reduksi, dan konversi format

Pemanggilan dasarnya adalah: jq '<filter>' file.json atau disalurkan sebagai cat file.json | jq '<filter>'. Filter . (titik) adalah identitas—filter ini mencetak seluruh dokumen dengan format yang mudah dibaca.

# Pretty-print a JSON file
jq '.' data.json

# Or pipe from curl
curl -s https://api.github.com/users/torvalds | jq '.'

Memilih Bidang Objek dengan Notasi Titik

Untuk mengakses bidang dalam objek JSON, gunakan notasi titik: .fieldName. Anda dapat merangkai pemilih untuk menavigasi objek bertingkat.

  • .name — bidang tingkat teratas
  • .address.city — bidang bertingkat
  • ."field-with-dash" — bidang dengan karakter khusus memerlukan tanda kutip

Jika bidang tidak ada, jq mengembalikan null, bukan menghasilkan kesalahan. Hal ini membuatnya aman digunakan dalam skrip tanpa pemeriksaan null tambahan untuk bidang opsional.

# Given: {"name":"Alice","address":{"city":"Berlin","zip":"10115"}}
echo '{"name":"Alice","address":{"city":"Berlin","zip":"10115"}}' | jq '.name'
# Output: "Alice"

echo '{"name":"Alice","address":{"city":"Berlin","zip":"10115"}}' | jq '.address.city'
# Output: "Berlin"

Mengakses Elemen Larik dan Melakukan Iterasi

Larik JSON diakses dengan notasi kurung siku. jq menggunakan pengindeksan berbasis nol.

  • .items[0] — elemen pertama
  • .items[-1] — elemen terakhir
  • .items[1:3] — irisan (indeks 1 hingga sebelum indeks 3)
  • .items[] — menguraikan larik: menghasilkan setiap elemen sebagai nilai terpisah (ini adalah iterator)

Iterator [] merupakan dasar alur pemrosesan jq—iterator ini memungkinkan Anda menerapkan filter berikutnya secara terpisah pada setiap elemen.

# Given an array of users
echo '[{"name":"Alice"},{"name":"Bob"},{"name":"Carol"}]' | jq '.[0]'
# Output: {"name":"Alice"}

# Iterate all elements and extract .name from each
echo '[{"name":"Alice"},{"name":"Bob"},{"name":"Carol"}]' | jq '.[].name'
# Output:
# "Alice"
# "Bob"
# "Carol"

Membangun Alur Pemrosesan jq dengan Operator Pipa

Sama seperti pipa shell |, jq memiliki operator pipa internalnya sendiri. Operator ini meneruskan keluaran dari satu filter sebagai masukan ke filter berikutnya.

  • jq '.users[] | .name' — melakukan iterasi pada pengguna, lalu mengambil nama masing-masing
  • jq '.data | .items[] | .id' — menavigasi ke data, menguraikan elemen, lalu mengambil id

Pipa di dalam ekspresi jq memungkinkan transformasi kompleks dibangun langkah demi langkah. Setiap tahap menerima apa pun yang dihasilkan tahap sebelumnya—termasuk banyak nilai dari iterator.

Wawasan utama: ketika iterator menghasilkan N nilai, setiap filter setelahnya dijalankan N kali, satu kali untuk setiap nilai.

# Nested pipeline: navigate -> iterate -> extract
echo '{"users":[{"name":"Alice","age":30},{"name":"Bob","age":25}]}' \
  | jq '.users[] | .name'
# Output:
# "Alice"
# "Bob"

# Chain more stages
echo '{"users":[{"name":"Alice","age":30},{"name":"Bob","age":25}]}' \
  | jq '.users[] | .age'
# Output:
# 30
# 25

Memfilter dengan select()

Filter select(condition) hanya meneruskan nilai jika kondisinya benar; jika tidak, filter ini tidak menghasilkan keluaran. Filter ini setara dengan grep atau WHERE dalam SQL.

  • select(.age > 18) — mempertahankan objek yang usianya lebih dari 18
  • select(.status == "active") — pemeriksaan kesamaan
  • select(.name | startswith("A")) — pengujian string bertingkat

Gabungkan select dengan iterator untuk memfilter larik: .items[] | select(.active) hanya menghasilkan elemen yang .active-nya bernilai benar.

# Filter array elements by a condition
echo '[{"name":"Alice","age":30},{"name":"Bob","age":17},{"name":"Carol","age":25}]' \
  | jq '.[] | select(.age >= 18) | .name'
# Output:
# "Alice"
# "Carol"

# Filter by string equality
echo '[{"name":"Alice","role":"admin"},{"name":"Bob","role":"user"}]' \
  | jq '.[] | select(.role == "admin") | .name'
# Output: "Alice"

Membangun Ulang Objek dan Larik dengan {} dan []

jq memungkinkan Anda membentuk ulang data dengan membuat objek baru menggunakan {} dan larik baru menggunakan [].

  • {name: .name, city: .address.city} — memilih dan mengganti nama bidang ke dalam objek baru
  • [.items[] | .id] — mengumpulkan kembali nilai yang diiterasi ke dalam larik
  • Bentuk singkat: {name, age} setara dengan {name: .name, age: .age}

Membungkus alur pemrosesan dalam [...] disebut pembuatan larik dan sangat penting ketika Anda menginginkan larik JSON sebagai keluaran, bukan aliran nilai.

# Reshape: keep only selected fields
echo '[{"id":1,"name":"Alice","password":"secret"},{"id":2,"name":"Bob","password":"secret"}]' \
  | jq '[.[] | {id, name}]'
# Output:
# [
#   {"id": 1, "name": "Alice"},
#   {"id": 2, "name": "Bob"}
# ]

# Collect filtered names into an array
echo '[{"name":"Alice","active":true},{"name":"Bob","active":false}]' \
  | jq '[.[] | select(.active) | .name]'
# Output: ["Alice"]

Bekerja dengan Larik Bertingkat dan Penelusuran Rekursif

JSON di dunia nyata sering kali bertingkat sangat dalam. jq menyediakan dua alat untuk navigasi mendalam:

  • .a.b.c — jalur eksplisit ketika strukturnya diketahui
  • .. | .fieldName? — penelusuran rekursif: menelusuri setiap simpul dalam pohon dan menghasilkan nilai ketika kuncinya ada

Operator ? (percobaan) menekan kesalahan ketika bidang tidak ada pada simpul tertentu, yang sangat penting saat menggunakan penelusuran rekursif pada pohon heterogen.

Gunakan penelusuran rekursif secara hemat pada dokumen besar—penelusuran ini mengunjungi setiap simpul dan dapat berjalan lambat. Pilih jalur eksplisit jika strukturnya dapat diprediksi.

# Explicit deep path
echo '{"a":{"b":{"c":42}}}' | jq '.a.b.c'
# Output: 42

# Recursive descent: find all "id" values anywhere in the tree
echo '{"users":[{"id":1,"profile":{"id":99}},{"id":2}]}' \
  | jq '.. | .id?'
# Output:
# 1
# 99
# 2

Contoh Praktis: Mengurai Respons API curl

Salah satu penggunaan jq yang paling umum adalah mengurai respons API REST yang diambil dengan curl. Menggabungkan curl -s (senyap) dengan alur pemrosesan jq memberi Anda ekstraksi data yang bersih dan dapat dijadikan skrip.

  • Mengekstrak satu nilai: curl -s URL | jq '.field'
  • Membuat tabel ringkasan: melakukan iterasi pada larik, lalu membangun ulang objek hanya dengan bidang yang diperlukan
  • Gunakan -r (keluaran mentah) untuk menghapus tanda kutip pembungkus dari nilai string—penting saat menetapkan nilai ke variabel shell

Tips: selalu tambahkan -r ketika keluaran jq akan digunakan sebagai variabel shell atau disalurkan ke perintah lain.

#!/usr/bin/env bash
# Fetch GitHub repo info and extract specific fields
REPO="torvalds/linux"
RESPONSE=$(curl -s "https://api.github.com/repos/${REPO}")

# Extract fields
STARS=$(echo "$RESPONSE" | jq -r '.stargazers_count')
LANG=$(echo  "$RESPONSE" | jq -r '.language')
DESC=$(echo  "$RESPONSE" | jq -r '.description')

echo "Stars : $STARS"
echo "Lang  : $LANG"
echo "Desc  : $DESC"

Menggunakan map() dan map_values()

jq menyediakan dua fungsi tingkat tinggi yang praktis untuk mengubah kumpulan data:

  • map(f) — menerapkan filter f pada setiap elemen larik dan mengembalikan larik baru. Setara dengan [.[] | f].
  • map_values(f) — menerapkan f pada setiap nilai dalam objek atau larik, dengan tetap mempertahankan kunci/indeks.

Keduanya lebih mudah dibaca daripada membungkus alur pemrosesan secara manual dalam [] dan merupakan gaya jq idiomatis untuk transformasi yang harus tetap berupa larik.

# map: extract a field from each element
echo '[{"name":"Alice","score":95},{"name":"Bob","score":80}]' \
  | jq 'map(.name)'
# Output: ["Alice", "Bob"]

# map with select: filter + transform in one step
echo '[{"name":"Alice","score":95},{"name":"Bob","score":60}]' \
  | jq 'map(select(.score >= 70) | .name)'
# Output: ["Alice"]

# map_values: multiply every value in an object by 2
echo '{"a":1,"b":2,"c":3}' | jq 'map_values(. * 2)'
# Output: {"a":2,"b":4,"c":6}

Menangani Bidang Opsional dan Nilai Bawaan dengan //

Data JSON dari sumber eksternal sering kali tidak konsisten—bidang mungkin hilang atau bernilai null. jq menyediakan operator alternatif // (garis miring ganda) untuk memberikan nilai bawaan.

  • .nickname // "anonymous" — gunakan .nickname jika nilainya bukan null/false; jika tidak, gunakan "anonymous"
  • .count // 0 — nilai bawaan numerik
  • Gabungkan dengan select: select((.status // "inactive") == "active")

Ini jauh lebih ringkas daripada padanan shell-nya, ${VAR:-default}, dan dapat dikomposisikan dengan rapi di dalam alur pemrosesan yang lebih panjang.

# Provide defaults for missing/null fields
echo '[{"name":"Alice","role":"admin"},{"name":"Bob"}]' \
  | jq '[.[] | {name, role: (.role // "user")}]'
# Output:
# [
#   {"name": "Alice", "role": "admin"},
#   {"name": "Bob",   "role": "user"}
# ]

# Numeric default
echo '{"items":[1,2,3]}' | jq '.total // 0'
# Output: 0

Skrip Praktis: Pengurai Log JSON

Pencatatan terstruktur dalam JSON merupakan standar pada sistem modern. Berikut adalah skrip realistis yang membaca berkas log JSON berbatas baris, memfilter entri kesalahan, dan memformat ringkasan yang mudah dibaca manusia.

Pola utama yang digunakan:

  • -c (keluaran ringkas) — satu objek JSON per baris, berguna untuk menyalurkan data ke perulangan shell
  • --arg name value — menyisipkan variabel shell sebagai argumen string jq
  • select untuk pemfilteran berdasarkan tingkat log
  • -r untuk keluaran string mentah yang sesuai digunakan bersama echo
#!/usr/bin/env bash
# Parse newline-delimited JSON logs and report ERRORs
# Each log line: {"level":"ERROR","msg":"...","ts":"2024-01-15T10:23:00Z","svc":"auth"}

LOG_FILE="/var/log/app/app.log"
LEVEL="ERROR"

echo "=== $LEVEL entries in $LOG_FILE ==="

jq -r --arg lvl "$LEVEL" \
  'select(.level == $lvl) | "[\(.ts)] [\(.svc)] \(.msg)"' \
  "$LOG_FILE"

# Count errors per service
echo ""
echo "=== Error count by service ==="
jq -r --arg lvl "$LEVEL" \
  'select(.level == $lvl) | .svc' "$LOG_FILE" \
  | sort | uniq -c | sort -rn

Pemeriksaan Pemahaman: Perilaku select() pada jq

Uji pemahaman Anda tentang cara kerja select() di dalam alur pemrosesan jq.

Dengan perintah berikut:

echo '[{"name":"Alice","age":30},{"name":"Bob","age":17},{"name":"Carol","age":22}]' | jq '[.[] | select(.age >= 18) | .name]'

Apa hasil keluarannya?

Ringkasan Pelajaran: Alur Pemrosesan jq untuk Memfilter JSON

Anda telah mempelajari perangkat inti jq untuk menavigasi dan memfilter JSON dari baris perintah:

  • Notasi titik (.field, .a.b.c) memilih bidang dari objek
  • Akses array (.[0], .[]) mengakses indeks dan melakukan iterasi pada array
  • Operator pipa (|) menghubungkan filter; setiap tahap memproses semua nilai dari tahap sebelumnya
  • select(cond) memfilter nilai dan hanya meneruskan nilai yang kondisinya bernilai benar
  • Pembuatan objek/array ({}, [], map()) mengubah bentuk data menjadi struktur baru
  • Operator alternatif (//) menyediakan nilai bawaan untuk bidang yang bernilai null atau tidak ada
  • Bendera -r menghapus tanda kutip untuk penetapan variabel shell; --arg menyisipkan variabel shell dengan aman
  • Penelusuran rekursif (.. | .field?) mencari pada pohon bertingkat dalam ketika jalurnya tidak diketahui

Dengan blok-blok pembangun ini, Anda dapat mengubah respons API JSON, berkas log, atau konfigurasi apa pun menjadi data yang tepat sesuai kebutuhan skrip Anda—semuanya tanpa meninggalkan terminal.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menyaring dan Memilih JSON dengan Pipeline jq” gratis?

Ya — teks lengkap “Menyaring dan Memilih JSON dengan Pipeline jq” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus DevOps Bootcamp, upgrade ke CoddyKit PRO. Kursus DevOps Bootcamp mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menyaring dan Memilih JSON dengan Pipeline jq”?

Navigasikan objek dan array bertingkat menggunakan pemilih, pipe, dan filter select pada jq. Kamu berlatih DevOps Bootcamp dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai DevOps Bootcamp?

Tidak diperlukan pengalaman sebelumnya. DevOps Bootcamp di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Menyaring dan Memilih JSON dengan Pipeline jq” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran DevOps Bootcamp ini?

Ya. Setiap pelajaran DevOps Bootcamp menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menyaring dan Memilih JSON dengan Pipeline jq
  2. Mengubah dan Membangun Objek JSON dengan jq
  3. Menggunakan REST API dengan curl dan jq Bersama-sama
  4. Mengedit File Konfigurasi YAML dengan yq
← Kembali ke DevOps Bootcamp