JSON Biçimlendirici JavaScript — JSON.stringify()
Ü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.
{"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.
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:
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",...}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
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ç tutulduFonksiyon Replacer — Değerleri Dönüştür
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
// }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.
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.
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"
// }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
// 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
// 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şlerJSON.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.
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
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)
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.
// 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')// 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ı.
# 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)))
"# 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}'"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.
npm install 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",...}'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.
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 }))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
npm install 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.
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))
}
}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.
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.
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ı yokconst 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
// }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.
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 BigIntfunction 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"
// }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.
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 JSONimport { 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)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.
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.
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.
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.
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.
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.
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.
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.
// 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ırJavaScript 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
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.
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.