JSON v Bash pomocí jq — průvodce

·SRE & Shell Scripting Specialist·ZkontrolovánoErik Lindqvist·Publikováno

Používejte bezplatný JSON Formatter & Beautifier přímo v prohlížeči — bez instalace.

Vyzkoušet JSON Formatter & Beautifier online →

Když deploy skript začne zpracovávat API odpovědi nebo validovat konfigurační soubory v CI, znalost toho, jak formátovat JSON v bash, se stane rychle nezbytnou. Dva nástroje, které pokrývají 99 % reálných případů, jsou jq a python3 -m json.tool — oba dokáží spolehlivě zpracovat JSON bash pipeline, validovat s kódy ukončení a čistě integrovat do CI/CD workflow. Pro jednorázovou inspekci bez terminálu to prohlížečový JSON Formatter zvládne okamžitě. Tato příručka pokrývá instalaci jq, formátování z pipe a souborů, validační funkce, integraci CI/CD v GitHub Actions, pre-commit hooks, vzory heredoc a kdy sáhnout po záložním řešení Python stdlib.

KLÍČOVÉ BODY
  • jq . formátuje A validuje zároveň — ukončí s kódem 1 při neplatném JSON
  • • Používejte jq -e v CI pipeline: nenulové ukončení při prázdném/false/null výstupu
  • jq . file.json > /dev/null && echo "valid" — validovat bez změny výstupu
  • python3 -m json.tool funguje na libovolném systému bez dodatečné instalace
  • • Nikdy neprovádějte jq . f.json > f.json — shell zkrátí zdrojový soubor před tím, než jej jq přečte

Co je formátování JSON v Bash?

Formátování JSON v bash znamená transformaci kompaktního, minifikovaného JSON na odsazený, čitelný výstup. Podkladová data jsou nezměněná — liší se pouze mezery a zalomení řádků. V kontextu skriptování to záleží ze dvou důvodů: čitelnost při ladění a validace, když formátovač jako vedlejší efekt kontroluje syntaxi. Nástroje jako jq plně zparsují JSON před jeho přeformátováním, což znamená, že úspěšné spuštění formátování je zároveň implicitní kontrolou platnosti. Toto duální chování — formátovat a validovat v jednom kroku — je to, co dělá jq tak užitečným v automatizovaných pipeline.

Before · json
After · json
{"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 — Formátování JSON v Bash

jq je de facto standard pro zpracování JSON v shell skriptech (jq 1.6+, bash 4+). Je to účelově postavený příkazový řádkový JSON procesor, který umí formátovat, filtrovat, transformovat a validovat JSON. Filtr identity . prochází vstup nezměněný, ale naformátovaný. Když jq nemůže zparsovat vstup, ukončí se s kódem 1 — to je to, co jej dělá ideálním pro skriptování: formátování a validace jsou jedna operace.

Instalace jq

Bash
# macOS
brew install jq

# Debian / Ubuntu
apt-get install -y jq

# Fedora / RHEL / CentOS
dnf install jq

# Alpine (Docker obrazy)
apk add --no-cache jq

# Ověření
jq --version  # jq-1.7.1

Formátování ze stdin a ze souboru

Bash
# Přesměrování inline JSON přes jq
echo '{"host":"db-prod-01.internal","port":5432}' | jq .

# Přímé formátování souboru (výpis na stdout)
jq . config/feature-flags.json

# Formátování se 4-mezerovým odsazením
jq --indent 4 . config/feature-flags.json

# Formátování pomocí tabulátorů místo mezer
jq --tab . config/feature-flags.json

Zápis formátovaného výstupu do souboru

Bash
# Uložit formátovaný výstup (NEPŘESMĚROVÁVEJTE zpět do stejného souboru)
jq . compact.json > formatted.json

# Kompaktní (minifikovat) — opak formátování
jq -c . formatted.json
Poznámka:jq ukončí s kódem 1 při neplatném JSON, kódem 0 při úspěchu a kódem 5 při chybách použití. Toto využijte v příkazech if a guardech || exit 1 v celém skriptu.

Řazení klíčů a odebrání barev

Bash
# Seřadit všechny klíče abecedně (užitečné pro deterministické diff)
jq --sort-keys . config/app-config.json

# Zakázat barevný výstup při zápisu do log souboru
jq --monochrome-output . response.json >> deploy.log

Přehled voleb jq

Nejčastěji používané jq příznaky pro formátování a validační workflow:

Volba
Typ
Výchozí
Popis
.
filtr
Filtr identity — formátuje a vypíše celý vstup beze změny.
--indent N
int
2
Nastaví odsazení na N mezer (0–7). Pro standardní formátování použijte 2 nebo 4.
--tab
příznak
vypnuto
Odsazení tabulátorem místo mezerami.
-c / --compact-output
příznak
vypnuto
Výstup na jeden řádek (minifikace). Zruší pretty-printing.
-r / --raw-output
příznak
vypnuto
Výpis řetězců bez JSON uvozovek. Užitečné pro extrakci hodnot v prostém textu.
-e / --exit-status
příznak
vypnuto
Ukončí s kódem 1, pokud je výstup false nebo null. Ideální pro CI assertions.
-M / --monochrome-output
příznak
vypnuto
Zakáže barevný výstup — užitečné při přesměrování do souborů nebo ne-terminálních výstupů.
-S / --sort-keys
příznak
vypnuto
Seřadí všechny klíče objektu abecedně na každé úrovni vnoření.
-n / --null-input
příznak
vypnuto
Nečte žádný vstup; používejte s --arg / --argjson pro tvorbu JSON od základu.
--arg name val
řetězec
Sváže shell řetězec jako pojmenovanou jq proměnnou ($name) přístupnou ve filtru.

Validace JSON v Bash skriptu

Validace a formátování jsou v jq stejná operace — parsuje před výpisem. Přesměrujte stdout na /dev/null pokud chcete pouze kód ukončení bez formátovaného výstupu. Níže uvedený vzor je opakovaně použitelný v deploy skriptech, pre-commit hooks a CI pipeline. Při řešení incidentů je první věc, kterou dělám s neznámým API payloadem, přesměrování přes jq — promění zeď minifikovaného JSON v něco, co mohu skutečně číst a ladit.

Znovupoužitelná validační funkce

Bash
validate_json() {
  local file="$1"
  if jq . "$file" > /dev/null 2>&1; then
    echo "✓ Platný JSON: $file"
    return 0
  else
    echo "✗ Neplatný JSON: $file" >&2
    return 1
  fi
}

Přerušení deploye při neplatné konfiguraci

Bash
CONFIG="infra/k8s/app-config.json"
validate_json "$CONFIG" || { echo "Přerušení deploye: neplatná konfigurace" >&2; exit 1; }

Validace všech JSON souborů v adresáři

Bash
find ./config -name "*.json" | while read -r f; do
  jq . "$f" > /dev/null 2>&1 || echo "NEPLATNÝ: $f"
done
Poznámka:Příznak -e / --exit-status jde dál: ukončí s kódem 1 také tehdy, když výstup je false nebo null. Používejte jej pro assertion, že konkrétní pole je pravdivé: jq -e '.feature_flags.new_checkout' config.json.

Formátování JSON ze souborů a API odpovědí

Dva běžné zdroje JSON v shell skriptech jsou soubory na disku a HTTP API odpovědi přes curl. Každý má mírně odlišný vzor zpracování. U souborů je hlavní starostí bezpečná přímá editace. U API odpovědí je klíčovým detailem potlačení ukazatele průběhu curl, aby nenarušil vstup jq.

Bezpečné přímé formátování souboru

Bash
# Bezpečné formátování a přepsání pomocí dočasného souboru
tmp=$(mktemp)
jq --indent 2 . config/feature-flags.json > "$tmp" && mv "$tmp" config/feature-flags.json
echo "config/feature-flags.json naformátován"

Formátování odpovědi curl API

Bash
# Formátování stavu deploye z API
DEPLOY_ID="dep_8f3a2b9c"
curl -s \
  -H "Authorization: Bearer $DEPLOY_API_TOKEN" \
  "https://api.deployments.internal/v1/deploys/$DEPLOY_ID" \
  | jq --indent 2 .

Simultánní formátování a filtrování

Bash
# Formátovaně + filtrovat pouze chyby z monitorovacího endpointu
curl -s "https://monitoring.internal/api/events?level=error&limit=10" \
  | jq '[.events[] | {id, message, timestamp, service}]' \
  || { echo "Nepodařilo se načíst nebo zparsovat události" >&2; exit 1; }

Vzor || { ... } je zde kritický. Bez něj selhaný curl nebo deformovaná API odpověď tiše prochází a další krok v skriptu pracuje s prázdnými nebo neúplnými daty. Pokud je potřeba prozkoumat komplexní vnořené odpovědi bez psaní výrazu filtru, prohlížečový JSON Formatter umožní vložit surovou odpověď a interaktivně procházet strom.

Formátování JSON v CI/CD pipeline

CI je místo, kde nejvíce záleží na JSON validačních branách — deformovaná konfigurace, která se dostane do produkce, je mnohem bolestivější na rollback než selhání pipeline. Níže uvedené vzory jsou ty, které používám v produkčních SRE workflow pro zachycení chyb konfigurace dříve, než se vůbec dostanou do deployment slotu.

GitHub Actions — validace všech JSON konfigurací

YAML
- name: Validace JSON konfigurací
  run: |
    echo "Validuji JSON konfigurační soubory..."
    find . -name "*.json" -not -path "*/node_modules/*" | while read -r f; do
      if ! jq . "$f" > /dev/null 2>&1; then
        echo "::error file=$f::Neplatná JSON syntaxe"
        exit 1
      fi
    done
    echo "Všechny JSON soubory jsou platné"

Pre-commit hook — validace staged JSON souborů

Bash
#!/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 "Neplatný JSON: $f"; exit 1; }
done
echo "JSON validace prošla"
Poznámka:Uložte pre-commit hook do scripts/validate-json.sh, nastavte jej jako spustitelný příkazem chmod +x scripts/validate-json.sh, poté vytvořte symlink: ln -s ../../scripts/validate-json.sh .git/hooks/pre-commit.

Formátování JSON proměnných a Heredocs v Bash

Shell skripty často dynamicky sestavují JSON payloady — z proměnných prostředí, git metadat nebo vypočtených hodnot. Nejbezpečnějším vzorem je jq -n --arg / --argjson namísto interpolace řetězců, která se rozbije ve chvíli, kdy hodnota obsahuje uvozovku nebo zalomení řádku. Při předávání do jq vždy použijte dvojité uvozovky kolem proměnných, aby se zabránilo word-splittingu na mezerách v JSON.

Formátování uložené proměnné API odpovědi

Bash
# Vždy citujte "$API_RESPONSE" — mezery v JSON by rozbily necitovanou expanzi
echo "$API_RESPONSE" | jq --indent 2 .

Sestavení a formátování payloadu pomocí jq -n

Bash
payload=$(jq -n \
  --arg env "production" \
  --arg version "$(git describe --tags)" \
  --argjson replicas 3 \
  '{environment: $env, version: $version, replicas: $replicas}')

# Prohlédnout sestavený payload
echo "$payload" | jq .

# Odeslat na API
curl -s -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $DEPLOY_API_TOKEN" \
  -d "$payload" \
  "https://api.deployments.internal/v1/deploys"
Poznámka:--arg vždy váže řetězcovou hodnotu. --argjson zparsuje hodnotu nejprve jako JSON, takže čísla, booleany, pole a objekty lze předat bez jejich citování uvnitř výrazu filtru.

Formátování JSON v Bash bez instalace jq

Když jq není dostupné — minimální Docker obrazy, zamčené CI runnery nebo systémy, kde nelze instalovat balíčky — vestavěný modul json.tool Pythonu poskytuje stejnou základní funkcionalitu. Je součástí standardní knihovny Pythonu; pokud je nainstalován Python 3, funguje bez dalších závislostí.

Bash
# Formátování ze souboru
python3 -m json.tool config.json

# Nastavení šířky odsazení
python3 -m json.tool --indent 2 config.json

# Řazení klíčů abecedně
python3 -m json.tool --sort-keys config.json

# Formátování ze stdin (např. přesměrováno z curl)
curl -s https://api.deployments.internal/v1/status | python3 -m json.tool
Upozornění:python3 -m json.tool je přísnější než jq: odmítá trailing čárky, komentáře a JSON5 rozšíření. Tato přísnost je žádoucí pro validaci produkčních konfigurací, ale může být třecím bodem při práci s volným JSON od nástrojů třetích stran. Také nevytváří barevný výstup, což činí inspekci terminálu méně ergonomickou než jq pro interaktivní použití.
Bash
# Validace s kódem ukončení (stejná sémantika jako jq)
python3 -m json.tool config.json > /dev/null && echo "platný" || echo "neplatný"

# Validace inline řetězce
echo '{"service":"payments-api","healthy":true}' | python3 -m json.tool > /dev/null
echo "Kód ukončení: $?"  # 0 = platný

Výstup terminálu se zvýrazněním syntaxe

jq barví svůj výstup ve výchozím nastavení — klíče modře, řetězce zeleně, čísla bíle. Když je potřeba plné zvýraznění syntaxe JSON v scrollovatelném pageru nebo při ladění velkých vnořených odpovědí v terminálové relaci, bat poskytuje nejergonomičtější zážitek. Oba jsou užitečné pro ladění a interaktivní inspekci; ani jeden by neměl být použit při zápisu výstupu do souborů nebo API odpovědí.

Instalace bat

Bash
# macOS
brew install bat

# Debian / Ubuntu (binární soubor může být pojmenován batcat — případně vytvořte alias)
apt-get install -y bat
# alias bat=batcat   # přidejte do ~/.bashrc pokud je potřeba

# Ověření
bat --version  # bat 0.24.0

Prohlížení JSON souborů se zvýrazněním syntaxe

Bash
# JSON se zvýrazněnou syntaxí v pageru (stiskněte q pro ukončení)
bat config/app-config.json

# Zakázat stránkování — výpis přímo do terminálu
bat --paging=never config/app-config.json

# Přesměrování výstupu jq přes bat pro barevnou inspekci
jq '.database' infra/app-config.json | bat --language=json --paging=never

Barevný výstup jq ve scrollovatelném pageru

Bash
# -C vynucuje barvy i když stdout není tty (např. při přesměrování do less)
jq -C . logs/deploy-response.json | less -R
Upozornění:Barevný výstup (bat / jq -C) používejte pouze pro terminálovou inspekci a ladění. Před zápisem do log souborů nebo přesměrováním do jiných nástrojů odstraňte ANSI barevné kódy — použijte jq -M . (--monochrome-output) nebo bat --plain.

Práce s velkými JSON soubory v Bash

Když JSON soubor překročí 50–100 MB, načítání do paměti ve výchozím režimu jq může být pomalé nebo způsobit OOM na hostitelích s omezenou pamětí (Docker kontejnery s limitem 512 MB, například). jq --stream inkrementálně vydává páry cesta/hodnota při čtení, bez bufferování celého dokumentu. Pro NDJSON (jeden JSON objekt na řádek) má jq efektivnější nativní přístup.

Streamování velkého JSON souboru pomocí jq --stream

Bash
# --stream vydává páry [cesta, skalár] při čtení vstupu jq
# Extrahovat všechna pole "status" z velkého log archivu bez jeho úplného načtení
jq -c --stream   'if length == 2 and (.[0][-1] == "status") then .[1] else empty end'   logs/archive-2026-03.json

NDJSON / JSON Lines — zpracování jednoho objektu na řádek

Bash
# NDJSON: jeden JSON objekt na řádek — běžné v exportech Kafka, Fluentd a Logstash
# -R čte surové řádky; fromjson? přeskakuje řádky, které nejsou platný JSON
jq -c -R 'fromjson? | {id: .request_id, status: .http_status, latency: .duration_ms}'   logs/access-2026-03-13.ndjson > logs/summary.ndjson
Bash
# Alternativa pomocí shell smyčky — užitečné když je potřeba zpracování chyb po řádcích
while IFS= read -r line; do
  echo "$line" | jq -c '{id: .request_id, status: .http_status}' 2>/dev/null ||     echo "PŘESKOČENO: deformovaný řádek" >&2
done < logs/access-2026-03-13.ndjson
Poznámka:Přepněte ze standardního jq . file.json na --stream když je soubor větší než 50–100 MB nebo když proces běží uvnitř kontejneru s limitem paměti. Pro NDJSON pipeline preferujte jq -R 'fromjson?' před shell smyčkou while read — je výrazně rychlejší, protože nevytváří subshell pro každý řádek.

Časté Chyby

Přepsání zdrojového souboru pomocí přesměrování shellu

Problém: Shell otevře a zkrátí výstupní soubor před tím, než jq přečte vstup. Pokud jsou zdroj a cíl stejnou cestou, jq přečte prázdný soubor.

Řešení: Nejdříve zapište do dočasného mktemp souboru a poté atomicky nahraďte originál pomocí mv.

Before · Bash
After · Bash
jq --indent 2 . settings.json > settings.json
tmp=$(mktemp) && jq --indent 2 . settings.json > "$tmp" && mv "$tmp" settings.json
Nezpracování selhání jq ve skriptech

Problém: Bez obsluhy chyb skript tiše pokračuje s prázdným nebo chybějícím formátovaným souborem když je JSON neplatný — navazující kroky pak selhávají s matoucími chybami.

Řešení: Po každém volání jq, které produkuje výstup používaný pozdějším krokem, přidejte || { echo '...' >&2; exit 1; }.

Before · Bash
After · Bash
jq . response.json > formatted.json
jq . response.json > formatted.json || { echo "Neplatný JSON v response.json" >&2; exit 1; }
Zapomenutí -s u curl

Problém: curl ve výchozím nastavení vypíše ukazatel průběhu na stderr. Když je stderr sloučen se stdout (např. v subshellech nebo při zachytávání logů), text ukazatele průběhu se objeví ve vstupu jq a způsobí chybu parsování.

Řešení: Při přesměrování do jq vždy předávejte -s (tichý) curl. Pokud je potřeba diagnostický výstup, použijte -v nebo --fail-with-body samostatně.

Before · Bash
After · Bash
curl https://api.payments.internal/config | jq .
curl -s https://api.payments.internal/config | jq .
Použití jq -r . s očekáváním formátovaného JSON

Problém: Příznak -r / --raw-output odstraní JSON uvozovky z hodnot řetězců nejvyšší úrovně — neformátuje objekty ani pole. Předání -r . objektovému vstupu produkuje stejný kompaktní objekt, ne odsazený výstup.

Řešení: Pro formátování použijte jq . (bez příznaku -r). -r si rezervujte pro extrakci hodnot prostého textu jako jq -r '.version' config.json.

Before · Bash
After · Bash
jq -r . config.json
jq . config.json

jq vs python3 vs json_pp — Rychlé Srovnání

Volba mezi nástroji závisí na tom, co je k dispozici ve vašem prostředí a co potřebujete nad rámec základního formátování:

Nástroj
Validuje
Barví
Vhodné pro CI
Kódy ukončení
Odsazení
Instalace
jq
✅ (kód 1)
✅ --indent N
brew / apt / dnf
python3 -m json.tool
✅ (přísné)
✅ (kód 1)
✅ --indent N
Vestavěné (Python)
json_pp (Perl)
⚠️ částečně
⚠️ různé
Vestavěné (Perl)
fx (Node.js)
⚠️ částečně
⚠️ omezené
npm install -g fx
node -e JSON.parse
✅ JSON.stringify
Vestavěné (Node.js)

Pro většinu bash skriptování a CI/CD práce je jq správnou výchozí volbou — validuje, formátuje, filtruje a poskytuje spolehlivé kódy ukončení v jediném binárním souboru bez runtime závislosti. Vraťte se k python3 -m json.tool když nelze nainstalovat další balíčky a Python je již přítomen.

Často Kladené Dotazy

Jak formátovat JSON soubor přímo v bash?

Nikdy nepřesměrovávejte výstup jq zpět do stejného souboru — shell soubor zkrátí před tím, než jej jq přečte. Místo toho nejdříve zapište do dočasného souboru a poté atomicky nahraďte originál pomocí mv.

Bash
tmp=$(mktemp)
jq --indent 2 . config/app-config.json > "$tmp" && mv "$tmp" config/app-config.json
echo "Úspěšně formátováno přímo"

Jak validovat JSON v bash skriptu a ukončit při chybě?

Předejte soubor jq přes pipe nebo přímo a přesměrujte stdout na /dev/null. Použijte || pro zachycení nenulového ukončení a přerušení skriptu. jq ukončí s kódem 1 při jakékoli chybě parsování, což jej činí spolehlivým pro CI brány.

Bash
validate_json() {
  local file="$1"
  if jq . "$file" > /dev/null 2>&1; then
    echo "✓ Platný JSON: $file"
    return 0
  else
    echo "✗ Neplatný JSON: $file" >&2
    return 1
  fi
}

validate_json infra/k8s/app-config.json || exit 1

Jak formátovat JSON v bash bez instalace jq?

Použijte vestavěný modul json.tool z python3 — dodává se s každou standardní instalací Pythonu a vytváří správně odsazený výstup se stejnou sémantikou kódů ukončení jako jq.

Bash
# Formátování ze souboru
python3 -m json.tool config.json

# Formátování ze stdin (např. odpověď curl)
curl -s https://api.internal/status | python3 -m json.tool --indent 2

Jak formátovat odpověď curl jako JSON v bash?

Vždy předejte -s (tichý) curl, aby ukazatele průběhu nenarušily vstup jq. Přesměrujte stdout curl přímo do jq.

Bash
DEPLOY_ID="dep_8f3a2b9c"
curl -s \
  -H "Authorization: Bearer $DEPLOY_API_TOKEN" \
  "https://api.deployments.internal/v1/deploys/$DEPLOY_ID" \
  | jq --indent 2 .

Jak formátovat pouze část JSON souboru pomocí jq?

Použijte jq výraz cesty místo filtru identity (.) pro extrakci a formátování vnořeného objektu nebo pole. Výsledek je sám formátovaný JSON.

Bash
# Formátovat pouze blok konfigurace databáze
jq --indent 2 '.database' infra/app-config.json

# Formátovat + filtrovat pole events pouze na úroveň chyb
jq '[.events[] | select(.level == "error") | {id, message, service}]' events.json

Jaký kód ukončení vrací jq pro neplatný JSON?

jq ukončí s kódem 1 při jakékoli chybě parsování a také když je nastaven příznak -e / --exit-status a výstup je false nebo null. Kód ukončení 0 znamená, že byl zparsován platný JSON a produkoval pravdivý výstup. Kód ukončení 5 znamená, že systém narazil na chybu použití.

Bash
# Testování kódu ukončení přímo
echo '{"ok":true}' | jq . > /dev/null 2>&1; echo "exit: $?"  # exit: 0
echo '{bad json}' | jq . > /dev/null 2>&1; echo "exit: $?"   # exit: 1

# -e příznak: exit 1 pokud je výstup false/null
echo 'null' | jq -e . > /dev/null 2>&1; echo "exit: $?"      # exit: 1

Související Nástroje

Prohlížečové alternativy a doplňky k bash JSON formátování — užitečné když potřebujete vizuální rozhraní, sdílitelný odkaz nebo pracujete mimo terminál:

Dostupné také v:PythonGoJavaScript
NO
Nadia OkonkwoSRE & Shell Scripting Specialist

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.

EL
Erik LindqvistTechnický recenzent

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.