JSON Biçimlendirici JavaScript — JSON.stringify()

·Front-end & Node.js Developer·İnceleyenMarcus Webb·Yayınlandı

Ücretsiz JSON Formatlayıcı ve Güzelleştirici aracını doğrudan tarayıcınızda kullanın — kurulum gerektirmez.

JSON Formatlayıcı ve Güzelleştirici Online Dene →

Node.js'te API yanıtlarını hata ayıklarken karşılaştığım ilk şey genellikle sıkıştırılmış bir JSON duvarıdır — tek bir JSON.stringify(data, null, 2) çağrısı yapıyı anında okunabilir kılar. JavaScript'te JSON biçimlendirmek için çalışma ortamının ötesinde hiçbir şeye ihtiyaç yoktur: JSON.stringify her tarayıcıya ve Node.js ortamına yerleşik gelir, kurulum gerekmez. Kod yazmadan hızlı bir sonuca ihtiyaç duyuyorsanız, ToolDeck'in JSON Biçimlendirici si bunu anında yapar. Bu rehber her şeyi pratik olarak ele alır: space parametresi, replacer dizileri ve fonksiyonları, Date, BigInt ve dairesel referansları ele alma, Node.js'te (18+) JSON dosyalarını okuma ve yazma, CLI'dan güzel yazdırma ve üretim serileştirmesi için fast-json-stringify kütüphanesi.

  • JSON.stringify(data, null, 2) her tarayıcıya ve Node.js'e yerleşik gelir — kurulum gerekmez.
  • replacer parametresi bir dizi (anahtar beyaz listesi) veya fonksiyon (değerleri dönüştür) kabul eder — hassas alanları maskelemek için kullanın.
  • Date nesneleri toJSON() → ISO 8601 dizesi aracılığıyla otomatik serileşir; BigInt TypeError fırlatır ve özel bir replacer gerektirir.
  • Dairesel referanslar TypeError fırlatır — replacer fonksiyonunda bir seen Set ile düzeltin ya da flatted kütüphanesini kullanın.
  • CLI'dan güzel yazdırma için node -p "JSON.stringify(require('./file.json'),null,2)" kullanın — ek araç gerekmez.

JSON Biçimlendirme Nedir?

JSON biçimlendirme (güzel yazdırma olarak da bilinir), sıkıştırılmış bir JSON dizesini tutarlı girinti ve satır sonlarıyla insan tarafından okunabilir bir düzene dönüştürür. Temel veri aynıdır — yalnızca boşluklar değişir. Sıkıştırılmış JSON, her baytın önemli olduğu ağ aktarımı için idealdir; biçimlendirilmiş JSON ise hata ayıklama, kod incelemesi ve log denetimi için idealdir. JavaScript'in JSON.stringify() fonksiyonu, space parametresini değiştirerek her ikisini tek bir çağrıda halleder.

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() — Yerleşik Biçimlendirici

JSON.stringify() tarayıcılar, Node.js, Deno, Bun dahil her JavaScript ortamında import gerektirmeyen global bir fonksiyondur. Üçüncü argümanı space girintiyi kontrol eder: seviye başına o kadar boşluk için bir sayı ya da sekme için '\t' dizesi girin. Atarsanız (ya da null geçerseniz) sıkıştırılmış tek satırlı çıktı alırsınız.

JavaScript — minimal çalışma örneği
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
//   }
// }

space parametresi bir sayı (1–10 boşluk) veya dize kabul eder. Sekme karakteri geçmek, birçok editör ve diff aracının tercih ettiği çıktıyı üretir. Üç parametrenin tamamını da birleştirebilirsiniz — config dosyalarına biçimlendirilmiş JSON yazarken kullandığım gerçek dünya deseni:

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

// 2 boşluklu girinti (JS projelerinde en yaygın)
JSON.stringify(telemetryEvent, null, 2)

// Sekme girintisi (bazı linter ve config araçlarının tercihi)
JSON.stringify(telemetryEvent, null, '\t')

// Sıkıştırılmış — boşluk yok (ağ aktarımı için)
JSON.stringify(telemetryEvent)
// {"eventId":"evt_3c7f9a2b","service":"checkout-api",...}
Not:undefined, fonksiyon ve Symbol değerleri çıktıdan sessizce atlanır. Bir özellik değeri undefined ise, o anahtar serileştirilmiş dizede hiç görünmez — bu, isteğe bağlı alanlara sahip nesneleri loglarken sık karşılaşılan bir hata kaynağıdır.

Replacer Fonksiyonları — Çıktıyı Filtrele ve Dönüştür

JSON.stringify() fonksiyonunun ikinci argümanı replacer'dır. İki formda gelir: belirli anahtarları beyaz listeye alan bir dizi veya her anahtar/değer çifti için çağrılan ve değerleri filtreleyebilen, dönüştürebilen ya da gizleyebilen bir fonksiyon. Hızlı bir alt küme gerektiğinde dizi formuna, loglamadan önce hassas verileri maskelemem gerektiğinde fonksiyon formuna başvururum.

Dizi Replacer — Belirli Anahtarları Beyaz Listeye Al

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

// Log çıktısına yalnızca güvenli alanları dahil et
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 ve customer.email hariç tutuldu

Fonksiyon Replacer — Değerleri Dönüştür

JavaScript — fonksiyon replacer
const auditRecord = {
  requestId: "req_7d2e91",
  user: { id: "usr_4421", email: "m.yilmaz@ornek.com.tr", apiKey: "sk-live-eKx9..." },
  action: "update_billing",
  timestamp: new Date("2026-03-10T14:22:00Z"),
  durationMs: 87
}

function safeReplacer(key, value) {
  // Gizli bilgi veya KKV gibi görünen alanları gizle
  if (key === "apiKey") return "[GİZLENDİ]"
  if (key === "email") return value.replace(/(?<=.{2}).+(?=@)/, "***")
  return value
}

console.log(JSON.stringify(auditRecord, safeReplacer, 2))
// {
//   "requestId": "req_7d2e91",
//   "user": { "id": "usr_4421", "email": "m.***@ornek.com.tr", "apiKey": "[GİZLENDİ]" },
//   "action": "update_billing",
//   "timestamp": "2026-03-10T14:22:00.000Z",
//   "durationMs": 87
// }
Not:Replacer fonksiyonu, mevcut anahtarı içeren nesneye this olarak ayarlanarak çağrılır. İlk çağrıda anahtar olarak boş dize ve serileştirilecek değerin tamamı geçirilir — normal serileştirmeye devam etmek için değişmeden döndürün.

Serileştirilemeyen Türleri Ele Alma

Tüm JavaScript değerleri JSON'a temiz şekilde eşlenemez. Her türün nasıl davrandığını bilmek, üretim kodundaki sessiz veri kayıplarını ve beklenmedik çalışma zamanı hatalarını önler.

Date — toJSON() Aracılığıyla Otomatik

Date nesneleri, ISO 8601 dizesi döndüren bir toJSON() metodu uygular. JSON.stringify() serileştirmeden önce toJSON() metodunu otomatik olarak çağırır, dolayısıyla özel bir işlem gerekmez.

JavaScript — Date serileştirme
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"
// }

// toJSON() metodu olan herhangi bir nesne aynı şekilde işlenir:
const custom = { toJSON: () => "custom-value", hidden: 42 }
JSON.stringify(custom) // '"custom-value"'

Özel Sınıflar — toJSON() Uygulayın

Herhangi bir sınıf bir toJSON() metodu uygulayabilir ve JSON.stringify() serileştirme sırasında bunu otomatik çağırır. Bu yaklaşım, kod tabanı boyunca görünen domain türleri için global bir replacer'dan daha temizdir.

JavaScript — özel toJSON()
class Money {
  constructor(amount, currency) {
    this.amount = amount
    this.currency = currency
  }
  toJSON() {
    // JSON.stringify tarafından otomatik çağrılır
    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 }  // Düz dize olarak serileştir
}

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

JSON.stringify(invoice, null, 2)
// {
//   "invoiceId": "inv_8f2a91bc",
//   "subtotal": { "amount": 199, "currency": "TRY", "formatted": "TRY 199.00" },
//   "tax": { "amount": 15.92, "currency": "TRY", "formatted": "TRY 15.92" },
//   "issuedAt": "2026-03-10T14:22:00.000Z"
// }
Not:toJSON(), replacer fonksiyonuna göre önceliklidir. Her ikisi de mevcutsa toJSON() önce çalışır — replacer, orijinal sınıf örneği yerine zaten dönüştürülmüş değeri alır.

BigInt — Replacer Olmadan TypeError

JavaScript — BigInt replacer
// Bu hata fırlatır: TypeError: Do not know how to serialize a BigInt
// JSON.stringify({ sessionId: 9007199254741234n })

// Çözüm: replacer'da BigInt'i dizeye çevir
function bigIntReplacer(_key, value) {
  return typeof value === 'bigint' ? value.toString() : value
}

const metrics = {
  requestCount: 9007199254741234n,  // Number.MAX_SAFE_INTEGER'ı aşıyor
  service: "ingestion-worker",
  region: "us-east-1"
}

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

Dairesel Referanslar — Seen Set Olmadan TypeError

JavaScript — dairesel referans replacer
// Bu hata fırlatır: TypeError: Converting circular structure to JSON
// const node = { id: "n1" }; node.self = node; JSON.stringify(node)

// Çözüm: görülen nesneleri WeakSet ile takip et
function circularReplacer() {
  const seen = new WeakSet()
  return function (_key, value) {
    if (typeof value === 'object' && value !== null) {
      if (seen.has(value)) return '[Dairesel]'
      seen.add(value)
    }
    return value
  }
}

const parent = { id: "node_parent", label: "kök" }
const child  = { id: "node_child", parent }
parent.child = child  // dairesel

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

// Alternatif: npm install flatted
// import { stringify } from 'flatted'
// stringify(parent)  // dairesel ref'leri yerel olarak işler

JSON.stringify() Parametre Referansı

Her üç parametre de modern JavaScript çalışma ortamlarında tam olarak desteklenir. Varsayılanlar sıkıştırılmış tek satırlı JSON üretir — okunabilir çıktı için parametreleri açıkça belirtin.

Parametre
Tür
Varsayılan
Açıklama
value
any
Serileştirilecek değer. Nesneler, diziler, dizeler, sayılar, boolean ve null yerel olarak desteklenir.
replacer
function | Array<string | number> | null
null
Anahtar/değer çiftlerini filtrele veya dönüştür. Dizi = dahil edilecek anahtarların beyaz listesi. Fonksiyon = her anahtar/değer için çağrılır.
space
number | string | null
null
Girinti. Sayı = seviye başına boşluk sayısı (maks. 10). Dize = gerçek girinti (örn. "\t"). null veya 0 = sıkıştırılmış çıktı.

Dosya ve API Yanıtından JSON Biçimlendirme

Node.js'te (18+) sıklıkla bir JSON config dosyasını yeniden biçimlendirmeniz ya da hata ayıklama amacıyla API yanıtını güzel yazdırmanız gerekir. Her iki desen de aynı iki adımlı yaklaşımı kullanır: ham metni JSON.parse() ile ayrıştırın, ardından JSON.stringify() ile yeniden serileştirin.

JSON Config Dosyasını Okuma ve Yeniden Yazma

Node.js 18+ — JSON dosyasını yeniden biçimlendirme (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('Config başarıyla yeniden biçimlendirildi')
} catch (err) {
  console.error('Config yeniden biçimlendirilemedi:', err.message)
  // Dosya geçersiz JSON içeriyorsa JSON.parse SyntaxError fırlatır
  // Dosya mevcut değilse readFileSync ENOENT fırlatır
}

Asenkron Dosya Yeniden Biçimlendirme (fs/promises)

Node.js 18+ — asenkron dosya yeniden biçimlendirme
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 }
}

// Kullanım
const { keys } = await reformatJson('./config/feature-flags.json')
console.log(`${keys} üst düzey anahtar yeniden biçimlendirildi`)

fetch() Yanıtından JSON Güzel Yazdırma

Node.js 18+ veya tarayıcıda bir API istemcisi oluştururken ya da hata ayıklarken, yanıt gövdesini güzel yazdırmak sunucunun ne döndürdüğünü anlamanın en hızlı yoludur. Standart desen response.json() (ayrıştırılmış nesne) ardından JSON.stringify() şeklindedir. Ham dizeye önce ihtiyacınız varsa — örneğin hash hesaplamak veya olduğu gibi loglamak için — response.text() ardından JSON.parse() kullanın.

JavaScript — fetch + güzel yazdırma (Node.js 18+ veya tarayıcı)
// Desen 1: response.json() → güzel yazdır
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 — önce ham dize gerektiğinde response.text()
// Desen 2: response.text() → ayrıştır → biçimlendir
// Hem ham yanıtı hem güzel yazdırmayı loglamak istediğinizde kullanışlı
async function inspectRawResponse(url) {
  const res = await fetch(url)
  const raw = await res.text()

  console.log('Ham yanıt uzunluğu:', raw.length)
  try {
    const parsed = JSON.parse(raw)
    console.log('Biçimlendirilmiş:')
    console.log(JSON.stringify(parsed, null, 2))
  } catch {
    console.error('Yanıt geçerli JSON değil:', raw.slice(0, 200))
  }
}

Komut Satırından Güzel Yazdırma

Node.js, ek araçlar olmadan terminalden JSON güzel yazdırmak için yeterli kapasiteye sahiptir. Bu tek satırlar CI betiklerinde, dağıtım pipeline'larında ve shell takma adlarında kullanışlıdır. Daha hızlı etkileşimli kullanım için jq yükleyin — komut satırında JSON işlemenin fiili standardı.

bash — Node.js ile JSON dosyasını güzel yazdır
# package.json'ı node -p (print) kullanarak güzel yazdır
node -p "JSON.stringify(require('./package.json'), null, 2)"

# stdin'den güzel yazdır (pipe dostu, CI'de çalışır)
echo '{"port":3000,"env":"production"}' | node -e "
  const d = require('fs').readFileSync(0, 'utf8')
  console.log(JSON.stringify(JSON.parse(d), null, 2))
"

# Bir dosyaya kaydedilmiş API yanıtını güzel yazdır
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 — evrensel alternatifler
# Python yedek (macOS ve çoğu Linux dağıtımında önceden yüklü)
cat api-response.json | python3 -m json.tool

# jq — en hızlı ve özellikli (brew install jq / apt install jq)
cat api-response.json | jq .

# jq — tek adımda güzel yazdır ve filtrele
cat api-response.json | jq '.data.users[] | {id, email}'
Not:Node.js'i ESM modunda çalıştırırken (örneğin package.json'da "type": "module" ile) require() tek satırlarda kullanılamaz. Bunun yerine --input-type=module ve fs.readFileSync kullanın ya da yukarıda gösterildiği gibi CommonJS parçacığıyla node -e'ye geçin.

Terminalde hiç değilseniz — bir Postman yanıtı veya log dosyası yapıştırıyorsanız — ToolDeck'in JSON Biçimlendiricisi söz dizimi vurgulama ve yerleşik doğrulama ile tek adımda yapıştırma, biçimlendirme ve kopyalamanıza olanak tanır.

Yüksek Performanslı Alternatif — fast-json-stringify

fast-json-stringify, bir JSON Şemasından adanmış bir serileştirici fonksiyonu oluşturur. Verinin şeklini önceden bildiği için tür denetimini atlayabilir ve özyinelemeli iniş yerine dize birleştirme kullanabilir — kıyaslamalar genellikle büyük, tekrarlayan payload'larda JSON.stringify() karşısında 2–5× iş hacmi iyileştirmesi gösterir. Serileştirme maliyetinin profil izlerinde görüldüğü yüksek frekanslı API rotalarında kullanıyorum.

bash
npm install fast-json-stringify
JavaScript — telemetri olayları için fast-json-stringify
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-west-1'
}

const json = serializeTelemetryEvent(event)
// '{"eventId":"evt_3c7f9a2b","service":"checkout-api","severity":"warn",...}'
Not:fast-json-stringify yapılandırılmış verilerin üretim serileştirmesi için tasarlanmıştır — her zaman sıkıştırılmış çıktı üretir (güzel yazdırma yoktur). Geliştirme sırasında insan tarafından okunabilir çıktı için JSON.stringify(data, null, 2) kullanmaya devam edin.

Sözdizimi Vurgulamalı Terminal Çıktısı

Node.js'in yerleşik util.inspect() fonksiyonu, terminal gösterimi için optimize edilmiş renkli, insan tarafından okunabilir çıktı üretir. Dairesel referansları ve BigInt'i yerel olarak ele alır ve iç içe nesneleri herhangi bir derinliğe kadar özyinelemeli olarak render eder. Çıktı geçerli JSON değildir — JavaScript sözdizimi kullanır (örneğin fonksiyonları ve Symbol'leri atlamak yerine render eder), bu da onu Node.js hata ayıklama betikleri için ideal kılarken API yanıtları veya dosya çıktısı için uygunsuz yapar.

Node.js 18+ — renklerle util.inspect
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 → tüm iç içe seviyeleri genişlet; colors: true → ANSI terminal renkleri
console.log(inspect(payload, { colors: true, depth: null }))
Uyarı:Dosyalara yazılan, ağ üzerinden gönderilen veya veritabanında saklanan JSON için util.inspect() kullanmayın. Çıktısı geçerli JSON değildir ve üzerinde JSON.parse() çağıran herhangi bir alt sistemde ayrıştırma hatasına neden olur. Yalnızca etkileşimli terminal hata ayıklaması için saklayın.

Büyük JSON Dosyalarıyla Çalışma

JSON.parse() ayrıştırmadan önce dosyanın tamamını belleğe yükler — küçük payload'lar için sorunsuz, ancak veritabanı dışa aktarmaları, uygulama log dökümü veya analitik gruplar gibi 50–100 MB üzerindeki dosyalar için pratik değildir. Bu durumlar için Node.js Streams ve stream-json kütüphanesi, heap'i patlatmadan kayıtları tek tek işlemenize olanak tanır.

stream-json ile Akışlı Ayrıştırma

bash
npm install stream-json
Node.js 18+ — büyük diziler için stream-json
import { pipeline } from 'stream/promises'
import { createReadStream } from 'fs'
import { parser } from 'stream-json'
import { streamArray } from 'stream-json/streamers/StreamArray.js'

// events.json = milyonlarca nesne dizisi — asla tam olarak belleğe yüklenmez
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 — Ek Bağımlılık Yok

NDJSON (Satır Sınırlı JSON), her satırda bir JSON nesnesi depolar ve Kafka dışa aktarmalarında, BigQuery çıktılarında ve yapılandırılmış log pipeline'larında yaygındır. Node.js'in yerleşik readline modülü, üçüncü taraf paket olmadan bunu işler.

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

// Format: satır başına bir JSON nesnesi (loglar, Kafka dışa aktarmaları, 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))
  }
}
Not:JSON dosyanız 50–100 MB'ı aşıyorsa veya sınırsız bir akışı (Kafka, log pipeline'ı) işliyorsanız JSON.parse() yerine akışlı yaklaşıma geçin. NDJSON / JSON Lines için readline kullanın — ek bağımlılık gerektirmez.

Yaygın Hatalar

Bu dört hata, kod incelemelerinde ve üretim hata raporlarında tekrar tekrar ortaya çıkar. Her biri, JSON.stringify() fonksiyonunun gözden kaçırılması kolay ve sonradan hata ayıklaması zor olan ince bir davranışını içerir.

undefined değerlerinin sessizce atlandığını unutmak

Sorun: undefined değerli nesne özellikleri JSON çıktısından tamamen çıkarılır — uyarı veya hata yoktur. Bu, nesnede isteğe bağlı alanlar bulunduğunda görünmez veri kaybına yol açar.

Çözüm: Serileştirilmiş çıktıda görünmesi gereken kasıtlı olarak eksik değerler için null kullanın. undefined'ı yalnızca JSON'dan hariç tutulması gereken alanlar için saklayın.

Before · JavaScript
After · JavaScript
const userProfile = {
  userId: "usr_4421",
  displayName: "Mehmet Yılmaz",
  avatarUrl: undefined,   // sessizce kaybolacak
  bio: undefined          // sessizce kaybolacak
}

JSON.stringify(userProfile, null, 2)
// { "userId": "usr_4421", "displayName": "Mehmet Yılmaz" }
// avatarUrl ve bio yok — uyarı yok
const userProfile = {
  userId: "usr_4421",
  displayName: "Mehmet Yılmaz",
  avatarUrl: null,   // kasıtlı olarak eksik — çıktıda görünür
  bio: null          // kasıtlı olarak eksik — çıktıda görünür
}

JSON.stringify(userProfile, null, 2)
// {
//   "userId": "usr_4421",
//   "displayName": "Mehmet Yılmaz",
//   "avatarUrl": null,
//   "bio": null
// }
BigInt TypeError fırlatır

Sorun: JSON.stringify()'a BigInt değeri geçmek çalışma zamanında TypeError fırlatır. Bu sessiz atlama değil, sert bir çökmedir — herhangi bir sayısal alan Number.MAX_SAFE_INTEGER'ı aşarsa üretimde ortaya çıkar.

Çözüm: Serileştirmeden önce BigInt değerlerini dizeye dönüştüren bir replacer fonksiyonu kullanın. Alternatif olarak JSON.stringify'a geçmeden önce veri katmanında BigInt'i dize veya Number'a dönüştürün.

Before · JavaScript
After · JavaScript
const session = {
  sessionId: 9007199254741234n,  // BigInt sabiti
  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"
// }
Dairesel referans çökmeleri

Sorun: Kendilerine referans veren nesneler — DOM ağaçlarında, bağlantılı listelerde ve bazı ORM sonuç kümelerinde yaygın — JSON.stringify()'a geçildiğinde TypeError fırlatır. Hata yalnızca serileştirme zamanında oluşur, genellikle dairesel referansın oluşturulduğu yerden çok uzakta.

Çözüm: Dairesel referansları tespit etmek ve değiştirmek için WeakSet kullanan bir replacer fonksiyonu kullanın ya da dairesel yapıları yerel olarak işleyen flatted kütüphanesini yükleyin.

Before · JavaScript
After · JavaScript
const dept = { id: "dept_eng", name: "Mühendislik" }
const team = { id: "team_frontend", dept }
dept.teams = [team]  // dairesel: 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: "Mühendislik" }
const team = { id: "team_frontend", dept }
dept.teams = [team]

// flatted dairesel ref'leri işler — not: çıktı flatted formatı, standart JSON değil
stringify(dept)

// Veya standart JSON çıktısı gerekiyorsa WeakSet tabanlı replacer kullanın:
function circularReplacer() {
  const seen = new WeakSet()
  return (_key, value) => {
    if (typeof value === 'object' && value !== null) {
      if (seen.has(value)) return '[Dairesel]'
      seen.add(value)
    }
    return value
  }
}
JSON.stringify(dept, circularReplacer(), 2)
space > 10 kullanmak (sessizce kırpılır)

Sorun: JSON.stringify()'a 10'dan büyük bir space değeri geçmek hata fırlatmaz — değer sessizce 10'a indirilir. Derin iç içe yapı için girinti başına 20 boşluk bekleyen geliştiriciler yalnızca 10 alır, bu da oluşturulan dosyalarda beklenmedik biçimlendirmeye yol açar.

Çözüm: Maksimum girinti 10 boşluktur. Derin yapılar için 2 boşluklu girintiyi (JavaScript projelerinde en yaygın kural) tercih edin ve gezinme için daraltılabilir editörlere güvenin.

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

// 20 boşluklu girinti bekleniyor — ama space 10'a kırpılır
JSON.stringify(deepConfig, null, 20)
// JSON.stringify(deepConfig, null, 10) ile aynı çıktı
// Hata yok, uyarı yok — sessizce kırpıldı
const deepConfig = { server: { tls: { certs: { primary: "/etc/ssl/api.pem" } } } }

// 2 (çoğu proje) veya 4 boşluk kullanın — asla 10'u aşmayın
JSON.stringify(deepConfig, null, 2)
// {
//   "server": {
//     "tls": {
//       "certs": {
//         "primary": "/etc/ssl/api.pem"
//       }
//     }
//   }
// }

JSON.stringify ve Alternatifler — Hızlı Karşılaştırma

Farklı durumlar farklı araçlar gerektirir. JSON.stringify ile replacer, bağımlılık olmadan çoğu üretim kullanım durumunu karşılar. util.inspect, renkli çıktıya ihtiyaç duyduğunuzda ve geçerli JSON gerekmediğinde hızlı terminal hata ayıklaması için doğru seçimdir. fast-json-stringify, profillemede serileştirme maliyetinin görüldüğü yüksek iş hacimli rotalarda karşılığını verir; diğer her şey için şema bakım yükü buna değmez.

Yöntem
Güzel Çıktı
Geçerli JSON
Non-ASCII
Özel Türler
Dairesel Ref.
Kurulum Gerekir
JSON.stringify
⚠️ replacer ile
✗ (hata fırlatır)
Hayır
JSON.stringify + replacer
✅ tam kontrol
Hayır
util.inspect
✅ yerel
Hayır (Node yerleşik)
fast-json-stringify
❌ yalnızca şema
npm install
flatted
✗ (özel format)
✅ yalnızca dairesel
npm install
jq (CLI)
Yok
Yok
Sistem kurulumu

Sıkça Sorulan Sorular

JavaScript'te JSON nasıl güzel yazdırılır?

JSON.stringify(data, null, 2) çağırın — üçüncü argüman girintiyi kontrol eder. Boşluk için 2 ya da 4, sekme için "\t" girin. İmport veya kurulum gerekmez: JSON, tarayıcılar ve Node.js dahil her JavaScript ortamında global bir nesnedir.

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
// }

JSON.stringify() içindeki `space` parametresi ne işe yarar?

space parametresi çıktıdaki girintiyi kontrol eder. Seviye başına o kadar boşluk için bir sayı (1–10) ya da sekme karakteri kullanmak için "\t" gibi bir dize girin. 10'un üzerindeki değerler sessizce 10'a indirilir. null, 0 veya parametreyi atlamak sıkıştırılmış tek satırlı JSON üretir.

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

JSON.stringify(data, null, 2)   // 2 boşluklu girinti
JSON.stringify(data, null, 4)   // 4 boşluklu girinti
JSON.stringify(data, null, '\t') // sekme girintisi
JSON.stringify(data)            // sıkıştırılmış: {"service":"payments","version":3,"active":true}

JSON.stringify() neden bazı değerler için undefined döndürür?

JSON.stringify, değerleri undefined, fonksiyon veya Symbol olan nesne özelliklerini sessizce atlar — bu türlerin JSON karşılığı yoktur. Üst düzey değerin kendisi undefined ise fonksiyon "undefined" dizesi yerine undefined döndürür. Çıktıda görünmesi gereken isteğe bağlı alanlar için undefined yerine null kullanın.

JavaScript
const event = {
  traceId: "tr_9a2f",
  handler: () => {},        // fonksiyon — atlanır
  requestId: undefined,     // undefined — atlanır
  sessionId: Symbol("s"),   // Symbol — atlanır
  status: "ok"
}
JSON.stringify(event, null, 2)
// { "traceId": "tr_9a2f", "status": "ok" }

JSON biçimlendirirken Date nesneleri nasıl ele alınır?

Date nesnelerinin ISO 8601 dizesi döndüren yerleşik bir toJSON() metodu vardır, dolayısıyla JSON.stringify bunları otomatik olarak işler. Tarihler için özel bir replacer gerekmez — serileştirilmiş değer "2026-03-10T14:22:00.000Z" gibi bir dize olacaktır.

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
// }

JavaScript'te JSON dizesini (nesne değil) nasıl biçimlendiririm?

Önce JSON.parse() ile dizeyi ayrıştırın, ardından JSON.stringify() ile yeniden serileştirin. Hızlı hata ayıklama için iki çağrı tek satırda zincirlenebilir.

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
// }

JSON.stringify() tarayıcıda kullanılabilir mi?

Evet. JSON, IE8'den bu yana her modern tarayıcıda yerleşik bir globaldır — script etiketi veya import gerekmez. DevTools konsolunu açın ve JSON.stringify() doğrudan çağırın. Node.js sürümüyle aynı şekilde çalışır; BigInt ve dairesel referanslar konusundaki sınırlamalar dahil aynı parametre imzasını kullanır.

JavaScript
// Chrome, Firefox, Safari, Edge'de çalışır — import gerekmez
const payload = { userId: "usr_7b3c", action: "checkout", cart: ["SKU-001", "SKU-002"] }
copy(JSON.stringify(payload, null, 2)) // copy() bir DevTools yardımcısıdır

JavaScript size tam kontrol sağlar — replacer fonksiyonları, özel toJSON(), Node.js'te büyük dosya işleme. Yalnızca biçimlendirilmiş bir parçacığı incelemeniz veya paylaşmanız gerektiğinde, ToolDeck'in JSON Biçimlendiricisi en hızlı yoldur: JSON'ınızı yapıştırın ve hiçbir ortam kurulumu olmadan biçimlendirilmiş, vurgulanmış bir sonuç alın.

İlgili Araçlar

Şu dillerde de mevcut: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 WebbTeknik İnceleyici

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.