JSON Formatter JavaScript — JSON.stringify()

·Front-end & Node.js Developer·ZkontrolovánoMarcus Webb·Publikováno

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

Vyzkoušet JSON Formatter & Beautifier online →

Když ladím odpovědi API v Node.js, zeď minifikovaného JSON je první věc, která mě zpomalí — jedno volání JSON.stringify(data, null, 2) a struktura se okamžitě stane čitelnou. Pro formátování JSON v JavaScriptu nepotřebuješ nic víc než runtime: JSON.stringify je vestavěný v každém prohlížeči a prostředí Node.js, bez instalace. Pokud potřebuješ rychlý výsledek bez psaní kódu, JSON Formatter od ToolDecku to zvládne okamžitě. Tento průvodce pokrývá vše praktické: parametr space, replacer pole a funkce, práci s Date, BigInt a cyklickými referencemi, čtení a zápis JSON souborů v Node.js (18+), CLI formátování a knihovnu fast-json-stringify pro produkční serializaci.

  • JSON.stringify(data, null, 2) je vestavěný v každém prohlížeči a Node.js — instalace není potřeba.
  • Parametr replacer přijímá pole (whitelist klíčů) nebo funkci (transformace hodnot) — použij ho pro maskování citlivých polí.
  • Objekty Date se serializují automaticky přes toJSON() → řetězec ISO 8601; BigInt vyhodí TypeError a vyžaduje vlastní replacer.
  • Cyklické reference vyhodí TypeError — oprav to pomocí WeakSet v replacer funkci nebo knihovnou flatted.
  • Pro CLI formátování použij node -p "JSON.stringify(require('./file.json'),null,2)" — žádné další nástroje nejsou potřeba.

Co je formátování JSON?

Formátování JSON (také nazývané pretty-printing) převádí kompaktní, minifikovaný JSON řetězec do lidsky čitelného rozložení s konzistentním odsazením a zalomením řádků. Podkladová data jsou identická — mění se pouze bílé znaky. Kompaktní JSON je optimální pro přenos po síti, kde záleží na každém bajtu; formátovaný JSON je optimální pro ladění, kontrolu kódu a inspekci logů. Javascriptová funkce JSON.stringify() zvládne obojí v jednom volání přepnutím parametru space.

Before · json
After · json
{"orderId":"ord_8f2a91bc","status":"shipped","items":[{"sku":"HDMI-4K-2M","qty":2,"unitPrice":12.99}],"total":25.98}
{
  "orderId": "ord_8f2a91bc",
  "status": "shipped",
  "items": [
    {
      "sku": "HDMI-4K-2M",
      "qty": 2,
      "unitPrice": 12.99
    }
  ],
  "total": 25.98
}

JSON.stringify() — Vestavěný formátovač

JSON.stringify() je globální funkce v každém prostředí JavaScriptu — prohlížeče, Node.js, Deno, Bun — bez importu. Třetí argument, space, řídí odsazení: předej číslo pro daný počet mezer na úroveň nebo řetězec '\t' pro tabulátor. Vynecháš-li ho (nebo předáš null), dostaneš kompaktní jednořádkový výstup.

JavaScript — minimal working example
const serverConfig = {
  host: "api.payments.internal",
  port: 8443,
  workers: 4,
  tls: { enabled: true, cert: "/etc/ssl/certs/api.pem" },
  rateLimit: { requestsPerMinute: 1000, burst: 50 }
}

console.log(JSON.stringify(serverConfig, null, 2))
// {
//   "host": "api.payments.internal",
//   "port": 8443,
//   "workers": 4,
//   "tls": {
//     "enabled": true,
//     "cert": "/etc/ssl/certs/api.pem"
//   },
//   "rateLimit": {
//     "requestsPerMinute": 1000,
//     "burst": 50
//   }
// }

Parametr space přijímá buď číslo (1–10 mezer) nebo řetězec. Znak tabulátoru dává výstup, který dává přednost mnoho editorů a diff nástrojů. Všechny tři parametry lze kombinovat — zde je vzor, který používám při zápisu formátovaného JSON do konfiguračních souborů:

JavaScript — space variations
const telemetryEvent = {
  eventId: "evt_3c7f9a2b",
  service: "checkout-api",
  severity: "warn",
  latencyMs: 342,
  region: "eu-west-1",
  tags: ["payment", "timeout", "retry"]
}

// Odsazení 2 mezerami (nejčastější v JS projektech)
JSON.stringify(telemetryEvent, null, 2)

// Odsazení tabulátorem (preferované některými lintery a konfiguračními nástroji)
JSON.stringify(telemetryEvent, null, '\t')

// Kompaktně — bez bílých znaků (pro přenos po síti)
JSON.stringify(telemetryEvent)
// {"eventId":"evt_3c7f9a2b","service":"checkout-api",...}
Poznámka:Hodnoty undefined, funkce a Symbol jsou tiše vynechány z výstupu. Pokud je hodnota vlastnosti undefined, tento klíč vůbec neobjeví v serializovaném řetězci — to je častý zdroj chyb při logování objektů s volitelnými poli.

Replacer funkce — filtrování a transformace výstupu

Druhý argument JSON.stringify() je replacer. Má dvě formy: pole, které zapsuje konkrétní klíče na whitelist, nebo funkce, která je volána pro každý pár klíč/hodnota a může filtrovat, transformovat nebo skrývat hodnoty. Pole používám, když potřebuji rychle vybrat podmnožinu; funkci, když potřebuji maskovat citlivá data před logováním.

Pole jako replacer — whitelist konkrétních klíčů

JavaScript — array replacer
const order = {
  orderId: "ord_8f2a91bc",
  customer: {
    id: "usr_4421",
    email: "j.novak@priklad.cz",
    passwordHash: "bcrypt:$2b$12$XKzV..."
  },
  items: [{ sku: "HDMI-4K-2M", qty: 2, unitPrice: 12.99 }],
  createdAt: "2026-03-10T14:22:00Z"
}

// Zahrnout do logu pouze bezpečná pole
const safeLog = JSON.stringify(order, ["orderId", "items", "createdAt"], 2)
// {
//   "orderId": "ord_8f2a91bc",
//   "items": [{ "sku": "HDMI-4K-2M", "qty": 2, "unitPrice": 12.99 }],
//   "createdAt": "2026-03-10T14:22:00Z"
// }
// passwordHash a customer.email jsou vyloučeny

Funkce jako replacer — transformace hodnot

JavaScript — function replacer
const auditRecord = {
  requestId: "req_7d2e91",
  user: { id: "usr_4421", email: "j.novak@priklad.cz", apiKey: "sk-live-eKx9..." },
  action: "update_billing",
  timestamp: new Date("2026-03-10T14:22:00Z"),
  durationMs: 87
}

function safeReplacer(key, value) {
  // Redigovat pole, která vypadají jako tajemství nebo osobní údaje
  if (key === "apiKey") return "[REDACTED]"
  if (key === "email") return value.replace(/(?<=.{2}).+(?=@)/, "***")
  return value
}

console.log(JSON.stringify(auditRecord, safeReplacer, 2))
// {
//   "requestId": "req_7d2e91",
//   "user": { "id": "usr_4421", "email": "j.***@priklad.cz", "apiKey": "[REDACTED]" },
//   "action": "update_billing",
//   "timestamp": "2026-03-10T14:22:00.000Z",
//   "durationMs": 87
// }
Poznámka:Replacer funkce je volána s this nastaveným na objekt obsahující aktuální klíč. Úplně první volání předá prázdný řetězec jako klíč a celou serializovanou hodnotu — vrať ji beze změny, aby pokračovala normální serializace.

Práce s neserializovatelnými typy

Ne všechny hodnoty JavaScriptu se přirozeně mapují na JSON. Znalost chování každého typu zabrání tiché ztrátě dat a neočekávaným chybám za běhu v produkčním kódu.

Date — automaticky přes toJSON()

Objekty Date implementují metodu toJSON(), která vrací řetězec ISO 8601. JSON.stringify() volá toJSON() automaticky před serializací, takže není potřeba žádné vlastní zpracování.

JavaScript — Date serialization
const webhook = {
  eventType: "payment.succeeded",
  occurredAt: new Date("2026-03-10T14:22:00Z"),
  processedAt: new Date()
}

JSON.stringify(webhook, null, 2)
// {
//   "eventType": "payment.succeeded",
//   "occurredAt": "2026-03-10T14:22:00.000Z",
//   "processedAt": "2026-03-10T14:22:01.347Z"
// }

// Jakýkoli objekt s metodou toJSON() je zpracován stejně:
const custom = { toJSON: () => "custom-value", hidden: 42 }
JSON.stringify(custom) // '"custom-value"'

Custom Classes — implementovat toJSON()

Jakákoli třída může implementovat metodu toJSON() a JSON.stringify() ji automaticky zavolá při serializaci. To je čistší než globální replacer pro doménové typy, které se vyskytují v celém kódu.

JavaScript — custom toJSON()
class Money {
  constructor(amount, currency) {
    this.amount = amount
    this.currency = currency
  }
  toJSON() {
    // Voláno automaticky JSON.stringify
    return { amount: this.amount, currency: this.currency, formatted: `${this.currency} ${this.amount.toFixed(2)}` }
  }
}

class OrderId {
  constructor(id) { this.id = id }
  toJSON() { return this.id }  // Serializovat jako prostý řetězec
}

const invoice = {
  invoiceId: new OrderId('inv_8f2a91bc'),
  subtotal: new Money(199.00, 'CZK'),
  tax:      new Money(15.92, 'CZK'),
  issuedAt: new Date('2026-03-10T14:22:00Z')
}

JSON.stringify(invoice, null, 2)
// {
//   "invoiceId": "inv_8f2a91bc",
//   "subtotal": { "amount": 199, "currency": "CZK", "formatted": "CZK 199.00" },
//   "tax": { "amount": 15.92, "currency": "CZK", "formatted": "CZK 15.92" },
//   "issuedAt": "2026-03-10T14:22:00.000Z"
// }
Poznámka:toJSON() má přednost před replacer funkcí. Pokud jsou přítomny obě, toJSON() se spustí první — replacer obdrží již převedenou hodnotu, ne původní instanci třídy.

BigInt — TypeError bez replaceru

JavaScript — BigInt replacer
// Toto vyhodí: TypeError: Do not know how to serialize a BigInt
// JSON.stringify({ sessionId: 9007199254741234n })

// Řešení: převést BigInt na řetězec v replaceru
function bigIntReplacer(_key, value) {
  return typeof value === 'bigint' ? value.toString() : value
}

const metrics = {
  requestCount: 9007199254741234n,  // překračuje Number.MAX_SAFE_INTEGER
  service: "ingestion-worker",
  region: "eu-central-1"
}

JSON.stringify(metrics, bigIntReplacer, 2)
// {
//   "requestCount": "9007199254741234",
//   "service": "ingestion-worker",
//   "region": "eu-central-1"
// }

Cyklické reference — TypeError bez Seen Set

JavaScript — circular reference replacer
// Toto vyhodí: TypeError: Converting circular structure to JSON
// const node = { id: "n1" }; node.self = node; JSON.stringify(node)

// Řešení: sledovat viděné objekty pomocí WeakSet
function circularReplacer() {
  const seen = new WeakSet()
  return function (_key, value) {
    if (typeof value === 'object' && value !== null) {
      if (seen.has(value)) return '[Circular]'
      seen.add(value)
    }
    return value
  }
}

const parent = { id: "node_parent", label: "root" }
const child  = { id: "node_child", parent }
parent.child = child  // cyklické

JSON.stringify(parent, circularReplacer(), 2)
// {
//   "id": "node_parent",
//   "label": "root",
//   "child": { "id": "node_child", "parent": "[Circular]" }
// }

// Alternativa: npm install flatted
// import { stringify } from 'flatted'
// stringify(parent)  // zpracovává cyklické reference nativně

Reference parametrů JSON.stringify()

Všechny tři parametry jsou dobře podporovány v každém moderním runtime JavaScriptu. Výchozí hodnoty dávají kompaktní jednořádkový JSON — předej parametry explicitně pro čitelný výstup.

Parametr
Type
Default
Popis
value
any
Hodnota k serializaci. Objekty, pole, řetězce, čísla, booleany a null jsou podporovány nativně.
replacer
function | Array<string | number> | null
null
Filtrování nebo transformace párů klíč/hodnota. Pole = whitelist klíčů k zahrnutí. Funkce = volána pro každý pár klíč/hodnota.
space
number | string | null
null
Odsazení. Číslo = mezery na úroveň (max. 10). Řetězec = znak odsazení (např. "\t"). null nebo 0 = kompaktní výstup.

Formátování JSON ze souboru a odpovědi API

V Node.js (18+) často potřebuješ přeformátovat JSON konfigurační soubor nebo pretty-printovat odpověď API pro ladění. Oba vzory používají stejný dvoustupňový přístup: parsovat surový text pomocí JSON.parse(), pak znovu serializovat pomocí JSON.stringify().

Čtení a přepsání JSON konfiguračního souboru

Node.js 18+ — reformat a JSON file (ESM)
import { readFileSync, writeFileSync } from 'fs'

try {
  const raw = readFileSync('./config/database.json', 'utf8')
  const config = JSON.parse(raw)
  writeFileSync('./config/database.json', JSON.stringify(config, null, 2))
  console.log('Konfigurace úspěšně přeformátována')
} catch (err) {
  console.error('Nepodařilo se přeformátovat konfiguraci:', err.message)
  // JSON.parse vyhodí SyntaxError, pokud soubor obsahuje neplatný JSON
  // readFileSync vyhodí ENOENT, pokud soubor neexistuje
}

Asynchronní přeformátování souboru (fs/promises)

Node.js 18+ — async file reformat
import { readFile, writeFile } from 'fs/promises'

async function reformatJson(filePath) {
  const raw = await readFile(filePath, 'utf8')
  const parsed = JSON.parse(raw)
  const formatted = JSON.stringify(parsed, null, 2)
  await writeFile(filePath, formatted, 'utf8')
  return { keys: Object.keys(parsed).length }
}

// Použití
const { keys } = await reformatJson('./config/feature-flags.json')
console.log(`Přeformátováno ${keys} klíčů nejvyšší úrovně`)

Pretty Print JSON z odpovědi fetch()

Při sestavování nebo ladění API klienta v Node.js 18+ nebo prohlížeči je pretty-printing těla odpovědi nejrychlejším způsobem, jak pochopit, co server vrátil. Standardní vzor je response.json() (parsovaný objekt) do JSON.stringify(). Pokud potřebuješ nejprve surový řetězec — například pro výpočet hashe nebo doslovné logování — použij response.text() a pak JSON.parse().

JavaScript — fetch + pretty print (Node.js 18+ or browser)
// Vzor 1: response.json() → pretty print
async function debugEndpoint(url) {
  const res = await fetch(url, {
    headers: { Authorization: `Bearer ${process.env.API_TOKEN}` }
  })
  if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`)

  const data = await res.json()
  console.log(JSON.stringify(data, null, 2))
}

await debugEndpoint('https://api.stripe.com/v1/charges?limit=3')
JavaScript — response.text() when you need the raw string first
// Vzor 2: response.text() → parse → format
// Užitečné, když chceš logovat surovou odpověď I naformátovanou
async function inspectRawResponse(url) {
  const res = await fetch(url)
  const raw = await res.text()

  console.log('Délka surové odpovědi:', raw.length)
  try {
    const parsed = JSON.parse(raw)
    console.log('Naformátovaný:')
    console.log(JSON.stringify(parsed, null, 2))
  } catch {
    console.error('Odpověď není platný JSON:', raw.slice(0, 200))
  }
}

Pretty Printing z příkazové řádky

Node.js má dostatek schopností pro pretty-printing JSON z terminálu bez dalších nástrojů. Tyto jednořádkové příkazy jsou užitečné v CI skriptech, deployment pipelínách a shell aliasech. Pro ještě rychlejší interaktivní použití nainstaluj jq — de-facto standard pro práci s JSON na příkazové řádce.

bash — pretty print a JSON file with Node.js
# Pretty-print package.json pomocí node -p (print)
node -p "JSON.stringify(require('./package.json'), null, 2)"

# Pretty-print ze stdin (pipe-friendly, funguje v CI)
echo '{"port":3000,"env":"production"}' | node -e "
  const d = require('fs').readFileSync(0, 'utf8')
  console.log(JSON.stringify(JSON.parse(d), null, 2))
"

# Pretty-print uložené API odpovědi
cat api-response.json | node -e "
  process.stdin.setEncoding('utf8')
  let s = ''
  process.stdin.on('data', c => s += c)
  process.stdin.on('end', () => console.log(JSON.stringify(JSON.parse(s), null, 2)))
"
bash — universal alternatives
# Python fallback (předinstalovaný na macOS a většině Linux distribucí)
cat api-response.json | python3 -m json.tool

# jq — nejrychlejší a nejbohatší na funkce (brew install jq / apt install jq)
cat api-response.json | jq .

# jq — pretty-print a filtrování v jednom kroku
cat api-response.json | jq '.data.users[] | {id, email}'
Poznámka:Při spuštění Node.js v ESM módu (např. s "type": "module" v package.json) require() není v jednořádkových příkazech dostupný. Použij --input-type=module a fs.readFileSync místo toho, nebo přejdi na node -e s CommonJS snippetem, jak je ukázáno výše.

Pokud nejsi vůbec v terminálu — vkládáš odpověď z Postmanu nebo soubor s logy — JSON Formatter od ToolDecku ti umožní vložit, naformátovat a zkopírovat v jednom kroku se zvýrazněním syntaxe a vestavěnou validací.

Výkonná alternativa — fast-json-stringify

fast-json-stringify generuje dedikovanou serializační funkci z JSON Schema. Protože zná tvar dat předem, může přeskočit typovou kontrolu a použít zřetězení řetězců místo rekurzivního průchodu — benchmarky typicky ukazují 2–5× zlepšení propustnosti oproti JSON.stringify() u velkých opakujících se payloadů. Používám ji na vysokofrekvenčních API routách, kde se serializační náklady projevují v profileru.

bash
npm install fast-json-stringify
JavaScript — fast-json-stringify for telemetry events
import fastJson from 'fast-json-stringify'

const serializeTelemetryEvent = fastJson({
  title: 'TelemetryEvent',
  type: 'object',
  properties: {
    eventId:   { type: 'string' },
    service:   { type: 'string' },
    severity:  { type: 'string', enum: ['info', 'warn', 'error'] },
    latencyMs: { type: 'integer' },
    timestamp: { type: 'string' },
    region:    { type: 'string' }
  },
  required: ['eventId', 'service', 'severity', 'latencyMs', 'timestamp']
})

const event = {
  eventId:   'evt_3c7f9a2b',
  service:   'checkout-api',
  severity:  'warn',
  latencyMs: 342,
  timestamp: new Date().toISOString(),
  region:    'eu-central-1'
}

const json = serializeTelemetryEvent(event)
// '{"eventId":"evt_3c7f9a2b","service":"checkout-api","severity":"warn",...}'
Poznámka:fast-json-stringify je navržen pro produkční serializaci strukturovaných dat — vždy produkuje kompaktní výstup (bez pretty-printingu). Pro čitelný výstup během vývoje používej JSON.stringify(data, null, 2) jako normálně.

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

Vestavěný Node.js util.inspect() produkuje barevný, lidsky čitelný výstup optimalizovaný pro zobrazení v terminálu. Zpracovává cyklické reference a BigInt nativně a rekurzivně renderuje vnořené objekty do libovolné hloubky. Výstup není platný JSON — používá syntaxi JavaScriptu, což ho dělá ideálním pro ladící skripty Node.js, ale nevhodným pro odpovědi API nebo výstup do souborů.

Node.js 18+ — util.inspect with colors
import { inspect } from 'util'

const payload = {
  requestId: "req_7d2e91",
  user: { id: "usr_4421", roles: ["admin", "billing"] },
  metadata: { ipAddress: "203.0.113.42", userAgent: "Mozilla/5.0" },
  createdAt: new Date()
}

// depth: null → rozbalit všechny vnořené úrovně; colors: true → ANSI barvy terminálu
console.log(inspect(payload, { colors: true, depth: null }))
Upozornění:Nepoužívej util.inspect() pro JSON zapsaný do souborů, odeslaný po síti nebo uložený v databázi. Jeho výstup není platný JSON a způsobí chyby parsování v jakémkoli downstream systému, který na něm volá JSON.parse(). Rezervuj ho pouze pro interaktivní ladění v terminálu.

Práce s velkými JSON soubory

JSON.parse() načte celý soubor do paměti před parsováním — to je v pořádku pro malé payloady, ale nepraktické pro soubory nad 50–100 MB, jako jsou databázové exporty, dumpy logů aplikací nebo analytické dávky. Pro tyto případy Node.js Streams a knihovna stream-json umožňují zpracovávat záznamy po jednom, aniž by přetížily haldu.

Streamové parsování pomocí stream-json

bash
npm install stream-json
Node.js 18+ — stream-json for large arrays
import { pipeline } from 'stream/promises'
import { createReadStream } from 'fs'
import { parser } from 'stream-json'
import { streamArray } from 'stream-json/streamers/StreamArray.js'

// events.json = pole milionů objektů — nikdy se plně nenačte do paměti
await pipeline(
  createReadStream('./events.json'),
  parser(),
  streamArray(),
  async function* (source) {
    for await (const { value: event } of source) {
      if (event.severity === 'error') {
        console.log(JSON.stringify(event, null, 2))
      }
    }
  }
)

NDJSON / JSON Lines — bez dalších závislostí

NDJSON (Newline Delimited JSON) ukládá jeden JSON objekt na řádek a je běžný v Kafka exportech, výstupech BigQuery a strukturovaných log pipelínách. Vestavěný Node.js readline ho zpracovává bez jakýchkoli třetích stran.

Node.js 18+ — NDJSON with readline
import { createReadStream } from 'fs'
import { createInterface } from 'readline'

// Formát: jeden JSON objekt na řádek (logy, Kafka exporty, BigQuery)
const rl = createInterface({
  input: createReadStream('./logs.ndjson'),
  crlfDelay: Infinity
})

for await (const line of rl) {
  if (!line.trim()) continue
  const entry = JSON.parse(line)
  if (entry.level === 'error') {
    console.log(JSON.stringify(entry, null, 2))
  }
}
Poznámka:Přejdi od JSON.parse() na streaming, když JSON soubor překračuje 50–100 MB nebo při zpracování neomezeného streamu (Kafka, log pipeline). Pro NDJSON / JSON Lines použij readline — nepotřebuje žádné extra závislosti.

Časté chyby

Tyto čtyři chyby se opakovaně objevují v code review a produkčních bug reportech. Každá zahrnuje jemné chování JSON.stringify(), které se snadno přehlédne a po faktu těžko ladí.

Zapomínání, že undefined hodnoty jsou tiše odstraněny

Problém: Vlastnosti objektu s hodnotou undefined jsou zcela vynechány z JSON výstupu — bez varování nebo chyby. To způsobuje neviditelnou ztrátu dat, když objekt má volitelná pole.

Řešení: Používej null pro záměrně chybějící hodnoty, které musí být ve serializovaném výstupu. Rezervuj undefined pouze pro pole, která mají být z JSON vyloučena.

Before · JavaScript
After · JavaScript
const userProfile = {
  userId: "usr_4421",
  displayName: "Jakub Novák",
  avatarUrl: undefined,   // tiše zmizí
  bio: undefined          // tiše zmizí
}

JSON.stringify(userProfile, null, 2)
// { "userId": "usr_4421", "displayName": "Jakub Novák" }
// avatarUrl a bio jsou pryč — bez varování
const userProfile = {
  userId: "usr_4421",
  displayName: "Jakub Novák",
  avatarUrl: null,   // záměrně chybějící — objeví se ve výstupu
  bio: null          // záměrně chybějící — objeví se ve výstupu
}

JSON.stringify(userProfile, null, 2)
// {
//   "userId": "usr_4421",
//   "displayName": "Jakub Novák",
//   "avatarUrl": null,
//   "bio": null
// }
BigInt vyhodí TypeError

Problém: Předání hodnoty BigInt do JSON.stringify() vyhodí TypeError za běhu. Jde o tvrdý pád, ne tiché vynechání — projeví se v produkci, pokud jakékoli numerické pole překročí Number.MAX_SAFE_INTEGER.

Řešení: Použij replacer funkci, která převádí hodnoty BigInt na řetězce před serializací. Alternativně převeď BigInt na řetězec nebo Number ve vrstvě dat před předáním do JSON.stringify.

Before · JavaScript
After · JavaScript
const session = {
  sessionId: 9007199254741234n,  // BigInt literál
  userId: "usr_4421",
  startedAt: "2026-03-10T14:00:00Z"
}

JSON.stringify(session, null, 2)
// Uncaught TypeError: Do not know how to serialize a BigInt
function bigIntReplacer(_key, value) {
  return typeof value === 'bigint' ? value.toString() : value
}

const session = {
  sessionId: 9007199254741234n,
  userId: "usr_4421",
  startedAt: "2026-03-10T14:00:00Z"
}

JSON.stringify(session, bigIntReplacer, 2)
// {
//   "sessionId": "9007199254741234",
//   "userId": "usr_4421",
//   "startedAt": "2026-03-10T14:00:00Z"
// }
Pád kvůli cyklickým referencím

Problém: Objekty, které odkazují samy na sebe — běžné v DOM stromech, propojených seznamech a výsledcích některých ORM — vyhodí TypeError předáním do JSON.stringify(). Chyba nastane až při serializaci, často daleko od místa, kde byla cyklická reference vytvořena.

Řešení: Použij replacer funkci s WeakSet pro detekci a nahrazení cyklických referencí, nebo nainstaluj knihovnu flatted jako drop-in náhradu, která nativně zvládá cyklické struktury.

Before · JavaScript
After · JavaScript
const dept = { id: "dept_eng", name: "Engineering" }
const team = { id: "team_frontend", dept }
dept.teams = [team]  // cyklické: dept → team → dept

JSON.stringify(dept, null, 2)
// Uncaught TypeError: Converting circular structure to JSON
import { stringify } from 'flatted'  // npm install flatted

const dept = { id: "dept_eng", name: "Engineering" }
const team = { id: "team_frontend", dept }
dept.teams = [team]

// flatted zpracovává cyklické reference — výstup je ve formátu flatted, ne standardní JSON
stringify(dept)

// Nebo použij WeakSet-based replacer pro standardní JSON výstup:
function circularReplacer() {
  const seen = new WeakSet()
  return (_key, value) => {
    if (typeof value === 'object' && value !== null) {
      if (seen.has(value)) return '[Circular]'
      seen.add(value)
    }
    return value
  }
}
JSON.stringify(dept, circularReplacer(), 2)
Použití space > 10 (tiše omezeno)

Problém: Předání hodnoty space větší než 10 do JSON.stringify() nevyhodí chybu — hodnota je tiše omezena na 10. Vývojáři, kteří očekávají 20 mezer pro hluboké vnoření, dostanou jen 10, což vede k neočekávanému formátování ve generovaných souborech.

Řešení: Maximální odsazení je 10 mezer. Pro hluboké struktury preferuj 2mezerové odsazení (nejčastější konvence v JavaScript projektech) a spoléhej na sbalovací editory pro navigaci.

Before · JavaScript
After · JavaScript
const deepConfig = { server: { tls: { certs: { primary: "/etc/ssl/api.pem" } } } }

// Očekávání odsazení 20 mezer — ale space je omezen na 10
JSON.stringify(deepConfig, null, 20)
// Stejný výstup jako JSON.stringify(deepConfig, null, 10)
// Žádná chyba, žádné varování — tiše zkráceno
const deepConfig = { server: { tls: { certs: { primary: "/etc/ssl/api.pem" } } } }

// Použij 2 (většina projektů) nebo 4 mezery — nikdy nepřekračuj 10
JSON.stringify(deepConfig, null, 2)
// {
//   "server": {
//     "tls": {
//       "certs": {
//         "primary": "/etc/ssl/api.pem"
//       }
//     }
//   }
// }

JSON.stringify vs. Alternativy — Rychlé srovnání

Různé situace vyžadují různé nástroje. JSON.stringify s replacerem pokrývá většinu produkčních případů bez závislostí. util.inspect je správnou volbou pro rychlé ladění v terminálu, když potřebuješ barevný výstup a nepotřebuješ platný JSON. fast-json-stringify se vyplatí na vysokopropustných routách, kde profilování ukazuje serializační náklady; pro vše ostatní nestojí overhead údržby schématu za to.

Metoda
Pretty Output
Valid JSON
Non-ASCII
Custom Types
Circular Refs
Instalace
JSON.stringify
⚠️ via replacer
✗ (throws)
Ne
JSON.stringify + replacer
✅ plná kontrola
Ne
util.inspect
✅ nativně
Ne (Node built-in)
fast-json-stringify
❌ schema-only
npm install
flatted
✗ (custom format)
✅ pouze circular
npm install
jq (CLI)
N/A
N/A
System install

Často kladené otázky

Jak naformátovat JSON v JavaScriptu?

Zavolej JSON.stringify(data, null, 2) — třetí argument řídí odsazení. Předej 2 nebo 4 pro mezery nebo "\t" pro tabulátor. Import ani instalace není potřeba: JSON je globální objekt v každém prostředí JavaScriptu, včetně prohlížečů a Node.js.

JavaScript
const config = { host: "api.payments.internal", port: 8443, tls: true }
console.log(JSON.stringify(config, null, 2))
// {
//   "host": "api.payments.internal",
//   "port": 8443,
//   "tls": true
// }

Co dělá parametr `space` v JSON.stringify()?

Parametr space řídí odsazení ve výstupu. Předej číslo (1–10) pro daný počet mezer na úroveň nebo řetězec jako "\t" pro tabulátor. Hodnoty nad 10 jsou tiše omezeny na 10. Předání null, 0 nebo vynechání parametru dá kompaktní jednořádkový JSON.

JavaScript
const data = { service: "payments", version: 3, active: true }

JSON.stringify(data, null, 2)   // odsazení 2 mezery
JSON.stringify(data, null, 4)   // odsazení 4 mezery
JSON.stringify(data, null, '\t') // odsazení tabulátorem
JSON.stringify(data)            // kompaktně: {"service":"payments","version":3,"active":true}

Proč JSON.stringify() vrací undefined pro některé hodnoty?

JSON.stringify tiše vynechává vlastnosti objektu, jejichž hodnoty jsou undefined, funkce nebo Symboly — tyto typy nemají JSON reprezentaci. Pokud je samotná vrcholová hodnota undefined, funkce vrátí undefined (ne řetězec "undefined"). Používej null místo undefined pro volitelná pole, která musí být ve výstupu.

JavaScript
const event = {
  traceId: "tr_9a2f",
  handler: () => {},        // funkce — vynechána
  requestId: undefined,     // undefined — vynechána
  sessionId: Symbol("s"),   // Symbol — vynechán
  status: "ok"
}
JSON.stringify(event, null, 2)
// { "traceId": "tr_9a2f", "status": "ok" }

Jak zacházet s objekty Date při formátování JSON?

Objekty Date mají vestavěnou metodu toJSON(), která vrací řetězec ISO 8601, takže JSON.stringify je zpracuje automaticky. Vlastní replacer pro data nepotřebuješ — serializovaná hodnota bude řetězec jako "2026-03-10T14:22:00.000Z".

JavaScript
const order = {
  orderId: "ord_8f2a91bc",
  placedAt: new Date("2026-03-10T14:22:00Z"),
  total: 42.98
}
JSON.stringify(order, null, 2)
// {
//   "orderId": "ord_8f2a91bc",
//   "placedAt": "2026-03-10T14:22:00.000Z",
//   "total": 42.98
// }

Jak naformátovat JSON řetězec (ne objekt) v JavaScriptu?

Nejprve rozparsuj řetězec pomocí JSON.parse(), pak ho znovu serializuj pomocí JSON.stringify(). Oba volání lze zřetězit v jednom řádku pro rychlé ladění.

JavaScript
const raw = '{"endpoint":"/api/v2/users","timeout":30,"retry":true}'
const formatted = JSON.stringify(JSON.parse(raw), null, 2)
console.log(formatted)
// {
//   "endpoint": "/api/v2/users",
//   "timeout": 30,
//   "retry": true
// }

Lze JSON.stringify() používat v prohlížeči?

Ano. JSON je vestavěný globální objekt v každém moderním prohlížeči od IE8 — žádné script tagy ani importy nejsou potřeba. Otevři konzoli DevTools a volej JSON.stringify() přímo. Funguje identicky jako verze Node.js, se stejnou signaturou parametrů a stejnými omezeními ohledně BigInt a cyklických referencí.

JavaScript
// Funguje v Chrome, Firefox, Safari, Edge — importy nejsou potřeba
const payload = { userId: "usr_7b3c", action: "checkout", cart: ["SKU-001", "SKU-002"] }
copy(JSON.stringify(payload, null, 2)) // copy() je pomocná funkce DevTools

JavaScript ti dává plnou kontrolu — replacer funkce, vlastní toJSON(), zpracování velkých souborů v Node.js. Když potřebuješ jen zkontrolovat nebo sdílet naformátovaný úryvek, JSON Formatter od ToolDecku je nejrychlejší cesta: vlož JSON a získej naformátovaný, zvýrazněný výsledek bez jakéhokoli nastavení prostředí.

Související nástroje

Dostupné také v:PythonGoBash
AC
Alex ChenFront-end & Node.js Developer

Alex is a front-end and Node.js developer with extensive experience building web applications and developer tooling. He is passionate about web standards, browser APIs, and the JavaScript ecosystem. In his spare time he contributes to open-source projects and writes about modern JavaScript patterns, performance optimisation, and everything related to the web platform.

MW
Marcus WebbTechnický recenzent

Marcus specialises in JavaScript performance, build tooling, and the inner workings of the V8 engine. He has spent years profiling and optimising React applications, working on bundler configurations, and squeezing every millisecond out of critical rendering paths. He writes about Core Web Vitals, JavaScript memory management, and the tools developers reach for when performance really matters.