Format JSON di Bash: Panduan jq dan python3
Gunakan JSON Formatter & Beautifier gratis langsung di browser Anda โ tidak perlu instalasi.
Coba JSON Formatter & Beautifier Online โKetika skrip deploy mulai memproses respons API atau memvalidasi file konfigurasi di CI, mengetahui cara memformat JSON di bash dengan cepat menjadi sangat penting. Dua alat yang mencakup 99% kasus dunia nyata adalah jq dan python3 -m json.tool โ keduanya dapat menjalankan pipeline format json bash secara andal, memvalidasi dengan kode keluar, dan terintegrasi dengan bersih ke dalam alur kerja CI/CD. Untuk inspeksi satu kali tanpa terminal, browser-based Pemformat JSON langsung menanganinya. Panduan ini mencakup instalasi jq, pemformatan pipe dan file, fungsi validasi, integrasi CI/CD di GitHub Actions, pre-commit hooks, pola heredoc, dan kapan harus menggunakan fallback Python stdlib.
- โข
jq .memformat DAN memvalidasi secara bersamaan โ keluar dengan kode 1 pada JSON tidak valid - โข Gunakan
jq -edi pipeline CI: exit non-zero pada output kosong/false/null - โข
jq . file.json > /dev/null && echo "valid"โ validasi tanpa mengubah output - โข
python3 -m json.toolberfungsi di sistem mana pun tanpa instalasi tambahan - โข Jangan pernah melakukan
jq . f.json > f.jsonโ shell memotong file sumber sebelum jq membacanya
Apa Itu Pemformatan JSON di Bash?
Pemformatan JSON di bash berarti mengubah JSON yang kompak dan diminifikasi menjadi output yang diindentasi dan mudah dibaca manusia. Data yang mendasarinya tidak berubah โ hanya spasi dan jeda baris yang berbeda. Dalam konteks scripting ini penting karena dua alasan: keterbacaan saat debugging, dan validasi saat formatter memeriksa ulang sintaks sebagai efek samping. Alat seperti jq mengurai JSON sepenuhnya sebelum memformatnya ulang, yang berarti menjalankan format yang berhasil juga merupakan pemeriksaan validitas implisit. Perilaku ganda itu โ format dan validasi dalam satu langkah โ inilah yang membuat jq begitu berguna dalam pipeline otomatis.
{"service":"payments-api","version":"2.4.1","database":{"host":"db-prod-01.internal","port":5432,"pool_size":20},"cache":{"enabled":true,"ttl":300}}{
"service": "payments-api",
"version": "2.4.1",
"database": {
"host": "db-prod-01.internal",
"port": 5432,
"pool_size": 20
},
"cache": {
"enabled": true,
"ttl": 300
}
}jq โ Memformat JSON di Bash
jq adalah standar de-facto untuk pemrosesan JSON dalam skrip shell (jq 1.6+, bash 4+). Ini adalah prosesor JSON command-line yang dibuat khusus yang dapat memformat, memfilter, mengubah, dan memvalidasi JSON. Filter identitas . meneruskan input tanpa perubahan, tetapi diformat. Ketika jq tidak dapat mengurai input, ia keluar dengan kode 1 โ inilah yang membuatnya ideal untuk scripting: pemformatan dan validasi adalah satu operasi.
Instal jq
# macOS brew install jq # Debian / Ubuntu apt-get install -y jq # Fedora / RHEL / CentOS dnf install jq # Alpine (image Docker) apk add --no-cache jq # Verifikasi jq --version # jq-1.7.1
Format dari stdin dan dari file
# Teruskan JSON inline melalui jq
echo '{"host":"db-prod-01.internal","port":5432}' | jq .
# Format file secara langsung (cetak ke stdout)
jq . config/feature-flags.json
# Format dengan indentasi 4 spasi
jq --indent 4 . config/feature-flags.json
# Format menggunakan tab alih-alih spasi
jq --tab . config/feature-flags.jsonTulis output yang diformat ke file
# Simpan output yang diformat (JANGAN redirect kembali ke file yang sama) jq . compact.json > formatted.json # Kompak (minifikasi) โ kebalikan dari pemformatan jq -c . formatted.json
jq keluar dengan kode 1 pada JSON tidak valid, kode 0 saat sukses, dan kode 5 pada kesalahan penggunaan. Gunakan ini dalam pernyataan if dan penjaga || exit 1 di seluruh skrip Anda.Urutkan kunci dan hapus warna
# Urutkan semua kunci secara alfabetis (berguna untuk diff deterministik) jq --sort-keys . config/app-config.json # Nonaktifkan output warna saat menulis ke file log jq --monochrome-output . response.json >> deploy.log
Referensi Opsi jq
Flag jq yang paling sering digunakan untuk alur kerja pemformatan dan validasi:
Validasi JSON dalam Skrip Bash
Validasi dan pemformatan adalah operasi yang sama di jq โ ia mengurai sebelum mencetak. Alihkan stdout ke /dev/null ketika Anda hanya menginginkan kode keluar tanpa output yang diformat. Pola di bawah ini dapat digunakan kembali di seluruh skrip deploy, pre-commit hooks, dan pipeline CI. Dalam respons insiden, hal pertama yang saya lakukan dengan payload API yang tidak familiar adalah meneruskannya melalui jq โ ini mengubah tembok JSON yang diminifikasi menjadi sesuatu yang benar-benar bisa saya baca dan debug.
Fungsi validasi yang dapat digunakan kembali
validate_json() {
local file="$1"
if jq . "$file" > /dev/null 2>&1; then
echo "โ JSON valid: $file"
return 0
else
echo "โ JSON tidak valid: $file" >&2
return 1
fi
}Batalkan deploy pada konfigurasi tidak valid
CONFIG="infra/k8s/app-config.json"
validate_json "$CONFIG" || { echo "Membatalkan deploy: konfigurasi tidak valid" >&2; exit 1; }Validasi semua file JSON dalam direktori
find ./config -name "*.json" | while read -r f; do jq . "$f" > /dev/null 2>&1 || echo "TIDAK VALID: $f" done
-e / --exit-status lebih jauh: ia juga keluar dengan kode 1 ketika output adalah false atau null. Gunakan untuk menyatakan bahwa field tertentu bernilai benar: jq -e '.feature_flags.new_checkout' config.json.Format JSON dari File dan Respons API
Dua sumber umum JSON dalam skrip shell adalah file di disk dan respons HTTP API melalui curl. Masing-masing memiliki pola penanganan yang sedikit berbeda. Untuk file, kekhawatiran utamanya adalah pengeditan aman di tempat. Untuk respons API, detail utamanya adalah menekan bilah kemajuan curl agar tidak merusak input jq.
Pemformatan aman di tempat untuk sebuah file
# Format dan timpa dengan aman menggunakan file temp tmp=$(mktemp) jq --indent 2 . config/feature-flags.json > "$tmp" && mv "$tmp" config/feature-flags.json echo "Memformat config/feature-flags.json"
Format respons curl API
# Format status deployment dari API DEPLOY_ID="dep_8f3a2b9c" curl -s \ -H "Authorization: Bearer $DEPLOY_API_TOKEN" \ "https://api.deployments.internal/v1/deploys/$DEPLOY_ID" \ | jq --indent 2 .
Format dan filter secara bersamaan
# Dapatkan yang diformat + filter ke error saja dari endpoint monitoring
curl -s "https://monitoring.internal/api/events?level=error&limit=10" \
| jq '[.events[] | {id, message, timestamp, service}]' \
|| { echo "Gagal mengambil atau mengurai events" >&2; exit 1; }Pola || { ... } sangat penting di sini. Tanpanya, curl yang gagal atau respons API yang cacat diteruskan secara diam-diam dan langkah berikutnya dalam skrip Anda beroperasi pada data kosong atau sebagian. Jika Anda perlu memeriksa respons bersarang yang kompleks tanpa terlebih dahulu menulis ekspresi filter, browser-based Pemformat JSON memungkinkan Anda menempel respons mentah dan menavigasi pohon secara interaktif.
Format JSON dalam Pipeline CI/CD
CI adalah tempat gerbang validasi JSON paling penting โ konfigurasi yang cacat yang mencapai produksi jauh lebih menyakitkan untuk di-rollback daripada kegagalan pipeline. Sebagian besar pesaing mendokumentasikan jq untuk penggunaan terminal satu kali; pola di bawah ini adalah yang saya gunakan dalam alur kerja SRE produksi untuk menangkap kesalahan konfigurasi sebelum pernah mencapai slot deployment.
GitHub Actions โ validasi semua konfigurasi JSON
- name: Validasi konfigurasi JSON
run: |
echo "Memvalidasi file konfigurasi JSON..."
find . -name "*.json" -not -path "*/node_modules/*" | while read -r f; do
if ! jq . "$f" > /dev/null 2>&1; then
echo "::error file=$f::Sintaks JSON tidak valid"
exit 1
fi
done
echo "Semua file JSON valid"Pre-commit hook โ validasi file JSON yang di-stage
#!/usr/bin/env bash
set -euo pipefail
STAGED=$(git diff --cached --name-only --diff-filter=ACM | grep '\.json$' || true)
[ -z "$STAGED" ] && exit 0
for f in $STAGED; do
jq . "$f" > /dev/null 2>&1 || { echo "JSON tidak valid: $f"; exit 1; }
done
echo "Validasi JSON berhasil"scripts/validate-json.sh, jadikan dapat dieksekusi dengan chmod +x scripts/validate-json.sh, lalu buat symlink: ln -s ../../scripts/validate-json.sh .git/hooks/pre-commit.Format Variabel JSON dan Heredoc di Bash
Skrip shell sering membangun payload JSON secara dinamis โ dari variabel lingkungan, metadata git, atau nilai yang dihitung. Pola yang paling aman adalah jq -n --arg / --argjson daripada interpolasi string, yang rusak saat sebuah nilai berisi tanda kutip atau baris baru. Selalu beri tanda kutip ganda pada variabel saat meneruskan ke jq untuk mencegah pemisahan kata pada spasi dalam JSON.
Format variabel respons API yang tersimpan
# Selalu beri tanda kutip "$API_RESPONSE" โ spasi dalam JSON akan merusak ekspansi yang tidak dikutip echo "$API_RESPONSE" | jq --indent 2 .
Bangun dan format payload dengan jq -n
payload=$(jq -n \
--arg env "production" \
--arg version "$(git describe --tags)" \
--argjson replicas 3 \
'{environment: $env, version: $version, replicas: $replicas}')
# Periksa payload yang dibangun
echo "$payload" | jq .
# Kirim ke API
curl -s -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DEPLOY_API_TOKEN" \
-d "$payload" \
"https://api.deployments.internal/v1/deploys"--arg selalu mengikat nilai string. --argjson mengurai nilai sebagai JSON terlebih dahulu, sehingga Anda dapat meneruskan angka, boolean, array, dan objek tanpa mengutipnya di dalam ekspresi filter.Format JSON di Bash Tanpa Menginstal jq
Ketika jq tidak tersedia โ image Docker minimal, CI runner yang terkunci, atau sistem di mana Anda tidak dapat menginstal paket โ modul json.tool bawaan Python menyediakan kemampuan inti yang sama. Ini adalah bagian dari pustaka standar Python; jika Python 3 terinstal, ini berfungsi tanpa dependensi tambahan.
# Format dari file python3 -m json.tool config.json # Kontrol lebar indentasi python3 -m json.tool --indent 2 config.json # Urutkan kunci secara alfabetis python3 -m json.tool --sort-keys config.json # Format dari stdin (mis., dialirkan dari curl) curl -s https://api.deployments.internal/v1/status | python3 -m json.tool
python3 -m json.tool lebih ketat dari jq: ia menolak koma trailing, komentar, dan ekstensi JSON5. Keketatan ini diinginkan untuk validasi konfigurasi produksi tetapi bisa menjadi titik gesekan saat bekerja dengan JSON yang longgar dari alat pihak ketiga. Ini juga tidak menghasilkan output berwarna, membuat inspeksi terminal kurang ergonomis daripada jq untuk penggunaan interaktif.# Validasi dengan kode keluar (semantik sama seperti jq)
python3 -m json.tool config.json > /dev/null && echo "valid" || echo "tidak valid"
# Validasi string inline
echo '{"service":"payments-api","healthy":true}' | python3 -m json.tool > /dev/null
echo "Kode keluar: $?" # 0 = validOutput Terminal dengan Penyorotan Sintaks
jq mewarnai outputnya secara default โ kunci berwarna biru, string hijau, angka putih. Ketika Anda memerlukan penyorotan sintaks JSON penuh dalam pager yang dapat digulir, atau saat men-debug respons bersarang yang besar dalam sesi terminal, bat memberikan pengalaman yang paling ergonomis. Keduanya berguna untuk debugging dan inspeksi interaktif; tidak satu pun yang boleh digunakan saat menulis output ke file atau respons API.
Instal bat
# macOS brew install bat # Debian / Ubuntu (binary mungkin bernama batcat โ buat alias jika demikian) apt-get install -y bat # alias bat=batcat # tambahkan ke ~/.bashrc jika diperlukan # Verifikasi bat --version # bat 0.24.0
Lihat file JSON dengan penyorotan sintaks
# JSON dengan penyorotan sintaks di pager (tekan q untuk keluar) bat config/app-config.json # Nonaktifkan paging โ cetak langsung ke terminal bat --paging=never config/app-config.json # Teruskan output jq melalui bat untuk inspeksi berwarna jq '.database' infra/app-config.json | bat --language=json --paging=never
Output jq berwarna dalam pager yang dapat digulir
# -C memaksa warna bahkan ketika stdout bukan tty (mis. saat meneruskan ke less) jq -C . logs/deploy-response.json | less -R
bat / jq -C) hanya untuk inspeksi terminal dan debugging. Hapus kode warna ANSI sebelum menulis ke file log atau meneruskan ke alat lain โ gunakan jq -M . (--monochrome-output) atau bat --plain.Bekerja dengan File JSON Besar di Bash
Ketika file JSON melebihi 50โ100 MB, memuatnya ke memori dengan mode default jq bisa lambat atau memicu OOM pada host yang dibatasi memori (container Docker dengan batas 512 MB, misalnya). jq --stream memancarkan pasangan path/value secara bertahap saat membaca, tanpa melakukan buffer seluruh dokumen. Untuk NDJSON (satu objek JSON per baris), jq memiliki pendekatan native yang lebih efisien.
Stream file JSON besar dengan jq --stream
# --stream memancarkan pasangan [path, skalar] saat jq membaca input # Ekstrak semua field "status" dari arsip log besar tanpa memuatnya sepenuhnya jq -c --stream 'if length == 2 and (.[0][-1] == "status") then .[1] else empty end' logs/archive-2026-03.json
NDJSON / JSON Lines โ proses satu objek per baris
# NDJSON: satu objek JSON per baris โ umum dalam ekspor Kafka, Fluentd, dan Logstash
# -R membaca baris mentah; fromjson? melewati baris yang bukan JSON valid
jq -c -R 'fromjson? | {id: .request_id, status: .http_status, latency: .duration_ms}' logs/access-2026-03-13.ndjson > logs/summary.ndjson# Alternatif loop shell โ berguna ketika Anda memerlukan penanganan error per baris
while IFS= read -r line; do
echo "$line" | jq -c '{id: .request_id, status: .http_status}' 2>/dev/null || echo "LEWATI: baris yang cacat" >&2
done < logs/access-2026-03-13.ndjsonjq . file.json standar ke --stream ketika file lebih besar dari 50โ100 MB atau ketika proses berjalan di dalam container dengan batas memori. Untuk pipeline NDJSON, lebih suka jq -R 'fromjson?' daripada loop while read shell โ ini jauh lebih cepat karena menghindari pembuatan subshell per baris.Kesalahan Umum
Masalah: Shell membuka dan memotong file output sebelum jq membaca input. Jika sumber dan tujuan adalah path yang sama, jq membaca file kosong.
Solusi: Tulis ke file sementara mktemp terlebih dahulu, lalu ganti aslinya secara atomik dengan mv.
jq --indent 2 . settings.json > settings.json
tmp=$(mktemp) && jq --indent 2 . settings.json > "$tmp" && mv "$tmp" settings.json
Masalah: Tanpa penanganan error, skrip secara diam-diam melanjutkan dengan file yang diformat kosong atau hilang ketika JSON tidak valid โ langkah selanjutnya kemudian gagal dengan error yang membingungkan.
Solusi: Tambahkan || { echo '...' >&2; exit 1; } setelah setiap panggilan jq yang menghasilkan output yang digunakan oleh langkah selanjutnya.
jq . response.json > formatted.json
jq . response.json > formatted.json || { echo "JSON tidak valid di response.json" >&2; exit 1; }Masalah: curl mencetak bilah kemajuan ke stderr secara default. Ketika stderr digabungkan dengan stdout (mis. dalam subshell atau pengambilan log), teks bilah kemajuan muncul di input jq dan menyebabkan kesalahan parsing.
Solusi: Selalu oper -s (silent) ke curl saat meneruskan ke jq. Gunakan -v atau --fail-with-body secara terpisah jika Anda memerlukan output diagnostik.
curl https://api.payments.internal/config | jq .
curl -s https://api.payments.internal/config | jq .
Masalah: Flag -r / --raw-output menghapus tanda kutip string JSON dari nilai string level atas โ ia tidak memformat objek atau array. Meneruskan -r . ke input objek menghasilkan objek kompak yang sama, bukan output dengan indentasi.
Solusi: Gunakan jq . (tanpa flag -r) untuk pemformatan. Simpan -r untuk mengekstrak nilai string biasa seperti jq -r '.version' config.json.
jq -r . config.json
jq . config.json
jq vs python3 vs json_pp โ Perbandingan Cepat
Memilih antara alat tergantung pada apa yang tersedia di lingkungan Anda dan apa yang Anda butuhkan selain pemformatan dasar:
Untuk sebagian besar scripting bash dan pekerjaan CI/CD, jq adalah default yang tepat โ ia memvalidasi, memformat, memfilter, dan menyediakan kode keluar yang andal dalam satu binary tanpa dependensi runtime. Gunakan python3 -m json.tool sebagai fallback ketika Anda tidak dapat menginstal paket tambahan dan Python sudah ada.
Pertanyaan yang Sering Diajukan
Bagaimana cara memformat file JSON di tempat menggunakan bash?
Jangan pernah mengalihkan output jq kembali ke file yang sama โ shell memotong file sebelum jq membacanya. Sebagai gantinya, tulis ke file temp terlebih dahulu, lalu ganti aslinya secara atomik dengan mv.
tmp=$(mktemp) jq --indent 2 . config/app-config.json > "$tmp" && mv "$tmp" config/app-config.json echo "Berhasil diformat di tempat"
Bagaimana cara memvalidasi JSON dalam skrip bash dan keluar saat terjadi kesalahan?
Teruskan atau oper file ke jq dan alihkan stdout ke /dev/null. Gunakan || untuk menangkap exit non-zero dan membatalkan skrip. jq keluar dengan kode 1 untuk setiap kesalahan parsing, membuatnya andal untuk gerbang CI.
validate_json() {
local file="$1"
if jq . "$file" > /dev/null 2>&1; then
echo "โ JSON valid: $file"
return 0
else
echo "โ JSON tidak valid: $file" >&2
return 1
fi
}
validate_json infra/k8s/app-config.json || exit 1Bagaimana cara memformat JSON di bash tanpa menginstal jq?
Gunakan modul json.tool bawaan python3 โ dilengkapi dengan setiap instalasi Python standar dan menghasilkan output dengan indentasi yang benar dengan semantik kode keluar yang sama seperti jq.
# Format dari file python3 -m json.tool config.json # Format dari stdin (mis., respons curl) curl -s https://api.internal/status | python3 -m json.tool --indent 2
Bagaimana cara memformat JSON dari respons curl di bash?
Selalu oper -s (silent) ke curl agar bilah kemajuan tidak merusak input jq. Teruskan stdout curl langsung ke jq.
DEPLOY_ID="dep_8f3a2b9c" curl -s \ -H "Authorization: Bearer $DEPLOY_API_TOKEN" \ "https://api.deployments.internal/v1/deploys/$DEPLOY_ID" \ | jq --indent 2 .
Bagaimana cara memformat hanya sebagian file JSON menggunakan jq?
Gunakan ekspresi path jq alih-alih filter identitas (.) untuk mengekstrak dan memformat objek atau array bersarang. Hasilnya sendiri adalah JSON yang diformat.
# Format hanya blok konfigurasi database
jq --indent 2 '.database' infra/app-config.json
# Format + filter array events hanya ke level error
jq '[.events[] | select(.level == "error") | {id, message, service}]' events.jsonKode keluar apa yang dikembalikan jq untuk JSON yang tidak valid?
jq keluar dengan kode 1 untuk setiap kesalahan parsing dan juga ketika flag -e / --exit-status diatur dan output adalah false atau null. Kode keluar 0 berarti JSON valid berhasil diparsing dan menghasilkan output yang benar. Kode keluar 5 berarti sistem mengalami kesalahan penggunaan.
# Uji kode keluar secara langsung
echo '{"ok":true}' | jq . > /dev/null 2>&1; echo "exit: $?" # exit: 0
echo '{bad json}' | jq . > /dev/null 2>&1; echo "exit: $?" # exit: 1
# flag -e: keluar 1 jika output false/null
echo 'null' | jq -e . > /dev/null 2>&1; echo "exit: $?" # exit: 1Alat Terkait
Alternatif dan pelengkap berbasis browser untuk pemformatan JSON bash โ berguna ketika Anda memerlukan antarmuka visual, tautan yang dapat dibagikan, atau sedang bekerja di luar terminal:
Nadia is a site reliability engineer who lives in the terminal. She writes Bash scripts that process logs, transform data, and orchestrate infrastructure across fleets of servers. She is a heavy user of jq, awk, and sed and writes about shell one-liners, text processing pipelines, data serialisation from the command line, and the practical Bash patterns that SREs reach for when speed matters more than elegance.
Erik is a DevOps engineer who has spent years writing and maintaining the shell scripts that hold CI/CD pipelines together. He writes about Bash best practices, portable POSIX shell, encoding and decoding in shell scripts, secret management from the command line, and the patterns that separate reliable automation scripts from brittle ones. He is a strong believer in making shell scripts readable and testable with tools like bats-core.