0Pricing
Linux Command Line & Bash Scripting Mastery · Pelajaran

Mengubah dan Membangun Objek JSON dengan jq

Susun ulang data dengan map, to_entries, dan konstruksi objek untuk menghasilkan payload JSON baru.

Mengubah dan Membangun Objek JSON dengan jq adalah pelajaran Linux Command Line & Bash Scripting Mastery gratis di CoddyKit. Ini adalah pelajaran 2 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 Linux Command Line & Bash Scripting Mastery, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Linux Command Line & Bash Scripting Mastery mencakup 4 pelajaran total.

Mengapa JSON Perlu Diubah Bentuknya?

JSON mentah dari API atau berkas log jarang memiliki bentuk yang benar-benar Anda perlukan. Anda mungkin menerima objek besar tetapi hanya menginginkan bidang tertentu, atau perlu mengganti nama kunci, meratakan struktur bertingkat, maupun membuat payload baru sepenuhnya untuk dikirim ke layanan lain.

jq adalah pemroses JSON baris perintah yang ringan dan bertenaga, yang memungkinkan transformasi ini dilakukan dalam satu alur pemrosesan. Dalam pelajaran ini, Anda akan mempelajari tiga teknik inti untuk mengubah bentuk data:

  • Pembuatan objek — membuat objek JSON baru dari awal
  • map — menerapkan transformasi pada setiap elemen array
  • to_entries / from_entries — memperlakukan pasangan kunci-nilai suatu objek sebagai array agar dapat difilter dan dibangun kembali

Semua contoh mengasumsikan jq telah terpasang (apt install jq / brew install jq).

Dasar-Dasar Pembuatan Objek

Fitur jq yang paling mendasar adalah pembuatan objek: membungkus ekspresi dalam {} untuk membuat objek JSON baru. Anda memilih bidang yang ingin disertakan dan nama yang akan digunakan.

Sintaks:

  • { newKey: .existingField } — mengganti nama bidang
  • { name, age } — bentuk singkat ketika kunci baru sama dengan nama bidang
  • { total: (.price * .qty) } — menghitung nilai secara langsung

Potongan kode di bawah membaca JSON produk dan menghasilkan bentuk yang lebih ringkas dengan bidang subtotal yang dihitung.

#!/usr/bin/env bash
# Object construction: pick and rename fields
product='{
  "id": 42,
  "name": "Widget Pro",
  "price": 9.99,
  "qty": 3,
  "warehouse": "EU-West"
}'

echo "$product" | jq '{
  productId: .id,
  name,
  subtotal: (.price * .qty)
}'

Membuat Objek dari Data Bertingkat

JSON di dunia nyata sering kali bertingkat. jq memungkinkan Anda mengakses jalur bertingkat di dalam konstruktor objek sekaligus meratakan strukturnya.

Gunakan notasi jalur titik di dalam ekspresi nilai konstruktor:

  • { city: .address.city }
  • { lat: .location.coords.lat }

Contoh di bawah mengambil catatan pengguna yang bertingkat dalam dan menghasilkan ringkasan datar yang sesuai untuk baris tajuk CSV atau isi permintaan API.

#!/usr/bin/env bash
user='{
  "id": "u-001",
  "profile": {
    "displayName": "Ada Lovelace",
    "contact": { "email": "ada@example.com", "phone": "+44-700" }
  },
  "plan": "pro"
}'

echo "$user" | jq '{
  id,
  name: .profile.displayName,
  email: .profile.contact.email,
  plan
}'

Mengubah Array dengan map

map(expr) adalah padanan jq untuk for-each: fungsi ini menerapkan expr pada setiap elemen array masukan dan mengembalikan array baru dengan panjang yang sama.

Poin penting:

  • map(expr) merupakan bentuk ringkas dari [.[] | expr]
  • Ekspresi di dalamnya dapat berupa filter jq apa pun, termasuk pembuatan objek
  • Rangkaikan dengan select() untuk memfilter sebelum melakukan transformasi

Potongan kode ini memproses daftar pesanan dan hanya mempertahankan bidang yang diperlukan untuk manifes pengiriman.

#!/usr/bin/env bash
orders='[
  {"orderId": 1, "customer": "Alice", "total": 42.50, "status": "shipped"},
  {"orderId": 2, "customer": "Bob",   "total": 18.00, "status": "pending"},
  {"orderId": 3, "customer": "Carol", "total": 99.99, "status": "shipped"}
]'

# Produce a shipping manifest: only shipped orders, slim fields
echo "$orders" | jq '[
  .[] | select(.status == "shipped") | {
    id: .orderId,
    recipient: .customer,
    amount: .total
  }
]'

map dengan Bidang Hasil Perhitungan

Di dalam map, Anda dapat menghitung nilai baru, mengonversi tipe, dan menggabungkan bidang—bukan sekadar menyalinnya. Pola yang umum meliputi:

  • Interpolasi string: "\(.first) \(.last)"
  • Aritmetika: (.price * 1.2 | round) untuk markup 20%
  • Kondisional: if .score >= 90 then "A" else "B" end

Contoh di bawah memperkaya daftar karyawan dengan menambahkan fullName hasil perhitungan dan label seniority berdasarkan tahun pengalaman.

#!/usr/bin/env bash
staff='[
  {"first": "Grace", "last": "Hopper",  "years": 15},
  {"first": "Alan",  "last": "Turing",  "years": 4},
  {"first": "Linus", "last": "Torvalds","years": 9}
]'

echo "$staff" | jq 'map({
  fullName: "\(.first) \(.last)",
  years,
  seniority: (if .years >= 10 then "senior" elif .years >= 5 then "mid" else "junior" end)
})'

Memahami to_entries

to_entries mengonversi objek JSON menjadi array pasangan {key, value}. Dengan demikian, Anda dapat melakukan operasi array (map, select, sort) pada bidang-bidang objek—sesuatu yang tidak dapat dilakukan langsung pada objek.

Contoh transformasi:

  • Masukan: {"a": 1, "b": 2}
  • Keluaran: [{"key": "a", "value": 1}, {"key": "b", "value": 2}]

Operasi kebalikannya adalah from_entries, yang mengubah array tersebut kembali menjadi objek. Keduanya membentuk idiom to_entries | map(...) | from_entries untuk transformasi tingkat objek.

#!/usr/bin/env bash
# Demonstrate to_entries and from_entries
config='{"host": "db.local", "port": 5432, "ssl": true}'

echo "--- to_entries output ---"
echo "$config" | jq 'to_entries'

echo "--- round-trip back to object ---"
echo "$config" | jq 'to_entries | from_entries'

Memfilter Kunci dengan to_entries

Salah satu penggunaan to_entries yang paling praktis adalah memfilter secara dinamis kunci yang ingin dipertahankan atau dibuang berdasarkan nama kuncinya sendiri—sesuatu yang tidak dapat dilakukan oleh pembuatan objek ketika Anda belum mengetahui nama kunci sebelumnya.

Pola:

  • to_entries | map(select(.key | test("regex"))) | from_entries
  • to_entries | map(select(.key != "secret")) | from_entries

Potongan kode di bawah menghapus semua kunci yang diawali garis bawah (bidang internal/pribadi) sebelum meneruskan objek konfigurasi ke layanan eksternal.

#!/usr/bin/env bash
raw_config='{
  "endpoint": "https://api.example.com",
  "timeout": 30,
  "_internalToken": "s3cr3t",
  "_debugMode": true,
  "retries": 3
}'

# Remove any key starting with underscore
echo "$raw_config" | jq '
  to_entries
  | map(select(.key | startswith("_") | not))
  | from_entries
'

Mengganti Nama Kunci Secara Dinamis dengan to_entries

Pembuatan objek mengganti nama kunci ketika Anda mengetahui namanya saat menulis kode. to_entries memungkinkan Anda mengganti nama kunci secara terprogram—misalnya mengonversi camelCase menjadi snake_case atau menambahkan awalan.

Di dalam map, Anda memperbarui bidang .key pada setiap entri, lalu meneruskannya ke from_entries:

  • map(.key |= gsub("(?<=[a-z])(?=[A-Z])"; "_") | .key |= ascii_downcase) — camelCase menjadi snake_case
  • map(.key |= "app_" + .) — menambahkan awalan ke setiap kunci

Contoh ini menambahkan awalan APP_ ke semua nama variabel lingkungan untuk memberi ruang nama sebelum menyisipkannya ke dalam kontainer.

#!/usr/bin/env bash
env_vars='{"host": "localhost", "port": "8080", "debug": "false"}'

# Add APP_ prefix and uppercase all keys
echo "$env_vars" | jq '
  to_entries
  | map({ key: ("APP_" + (.key | ascii_upcase)), value })
  | from_entries
'

with_entries: Bentuk Singkat yang Praktis

Pola to_entries | map(...) | from_entries sangat umum sehingga jq menyediakan bentuk singkat: with_entries(expr).

Fungsinya sama persis, tetapi lebih ringkas:

  • with_entries(.value |= . * 2) — menggandakan setiap nilai numerik
  • with_entries(select(.value != null)) — membuang kunci yang nilainya null
  • with_entries(.key |= ascii_upcase) — mengubah semua kunci menjadi huruf besar

Potongan kode ini menghapus semua kunci yang nilainya null atau string kosong—langkah pembersihan yang umum sebelum mengirim permintaan PATCH ke API REST.

#!/usr/bin/env bash
patch_body='{
  "name": "Mehmet",
  "email": "",
  "phone": null,
  "city": "Istanbul"
}'

# Drop empty/null fields before PATCH
cleaned=$(echo "$patch_body" | jq '
  with_entries(select(.value != null and .value != ""))
')

echo "Cleaned payload:"
echo "$cleaned"

# In practice you would pipe to curl:
# curl -s -X PATCH https://api.example.com/users/1 \
#   -H "Content-Type: application/json" \
#   -d "$cleaned"

Menggabungkan map dan Pembuatan Objek dalam Alur Pemrosesan

Transformasi nyata merangkaikan beberapa operasi jq. Alur pemrosesan umum untuk menyiapkan payload API dapat melakukan hal-hal berikut:

  1. Memfilter array masukan dengan map(select(...))
  2. Mengubah bentuk setiap elemen dengan pembuatan objek
  3. Menambahkan bidang hasil perhitungan
  4. Mengurutkan hasilnya

Contoh di bawah membaca daftar metrik server, hanya mempertahankan server dengan penggunaan CPU tinggi, lalu menghasilkan payload peringatan ringkas yang siap dikirim dengan POST ke webhook.

#!/usr/bin/env bash
metrics='[
  {"host": "web-01", "cpu": 23, "mem": 60, "region": "eu"},
  {"host": "web-02", "cpu": 91, "mem": 88, "region": "eu"},
  {"host": "db-01",  "cpu": 78, "mem": 95, "region": "us"},
  {"host": "db-02",  "cpu": 12, "mem": 40, "region": "us"}
]'

alerts=$(echo "$metrics" | jq '[
  .[] | select(.cpu > 75 or .mem > 85) | {
    server: .host,
    region,
    severity: (if .cpu > 90 or .mem > 90 then "critical" else "warning" end),
    metrics: { cpu: .cpu, mem: .mem }
  }
] | sort_by(.severity)')

echo "$alerts"

Membangun Objek JSON Baru dari Berbagai Sumber

jq dapat menggabungkan masukan dan membuat objek yang mengambil data dari beberapa sumber JSON menggunakan operator penjumlahan + dan pengikatan variabel dengan as $var.

Pola yang berguna:

  • obj1 + obj2 — menggabungkan dua objek (sisi kanan menang jika terjadi konflik kunci)
  • --argjson — meneruskan dokumen JSON kedua sebagai variabel
  • $ENV — membaca variabel lingkungan langsung di dalam jq

Potongan kode ini menggabungkan konfigurasi dasar dengan penggantian khusus lingkungan—pola yang umum untuk pengelolaan konfigurasi aplikasi 12-factor dalam skrip shell.

#!/usr/bin/env bash
base_config='{
  "logLevel": "info",
  "timeout": 30,
  "retries": 3,
  "database": "postgres://db.local/app"
}'

env_overrides='{
  "logLevel": "debug",
  "database": "postgres://db.staging/app_staging"
}'

# Merge: overrides win on conflicts
merged=$(echo "$base_config" | jq --argjson overrides "$env_overrides" '. + $overrides')

echo "Merged config:"
echo "$merged"

Pemeriksaan Pemahaman: to_entries vs map

Anda memiliki objek JSON berikut dan perlu menghapus semua kunci yang nilainya kurang dari 0, sehingga menghasilkan objek baru yang hanya berisi nilai non-negatif. Ekspresi jq mana yang melakukannya dengan benar?

Masukan: {"a": 10, "b": -3, "c": 0, "d": 5}

Ringkasan Pelajaran: Mengubah JSON dengan jq

Anda telah mempelajari teknik-teknik penting untuk mengubah bentuk JSON dengan jq:

  • Pembuatan objek {} — membuat objek baru dengan memilih, mengganti nama, dan menghitung bidang dari masukan
  • map(expr) — menerapkan transformasi apa pun pada setiap elemen array, termasuk pembuatan objek bertingkat dan select() untuk memfilter
  • to_entries / from_entries — mengonversi objek menjadi array pasangan {key, value}, sehingga operasi array dapat dilakukan pada kunci dan nilai, lalu mengonversinya kembali
  • with_entries(expr) — bentuk singkat alur pemrosesan lengkap to_entries → map → from_entries
  • Menggabungkan objek dengan + dan --argjson untuk payload dari berbagai sumber

Blok-blok pembangun ini dapat dirangkai: memfilter dengan select, mengubah bentuk dengan pembuatan objek, memperkaya dengan bidang hasil perhitungan, lalu merangkai semuanya dalam satu ekspresi jq yang mudah dibaca. Dengan menguasai pola-pola ini, Anda dapat mengolah hampir semua payload JSON langsung di shell tanpa menulis skrip khusus dalam Python atau Node.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengubah dan Membangun Objek JSON dengan jq” gratis?

Ya — teks lengkap “Mengubah dan Membangun Objek JSON dengan jq” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Linux Command Line & Bash Scripting Mastery, upgrade ke CoddyKit PRO. Kursus Linux Command Line & Bash Scripting Mastery mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mengubah dan Membangun Objek JSON dengan jq”?

Susun ulang data dengan map, to_entries, dan konstruksi objek untuk menghasilkan payload JSON baru. Kamu berlatih Linux Command Line & Bash Scripting Mastery 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 Linux Command Line & Bash Scripting Mastery?

Tidak diperlukan pengalaman sebelumnya. Linux Command Line & Bash Scripting Mastery 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 2 dari 4.

Berapa lama pelajaran “Mengubah dan Membangun Objek JSON dengan 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 Linux Command Line & Bash Scripting Mastery ini?

Ya. Setiap pelajaran Linux Command Line & Bash Scripting Mastery 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 Linux Command Line & Bash Scripting Mastery