JSON Formatter JavaScript — JSON.stringify()
Utilisez le Formateur et Embellisseur JSON gratuit directement dans votre navigateur — sans installation.
Essayer Formateur et Embellisseur JSON en ligne →Quand je débogue des réponses d'API dans Node.js, un mur de JSON minifié est la première chose qui me ralentit — un appel à JSON.stringify(data, null, 2) et la structure devient immédiatement lisible. Pour formater du JSON en JavaScript, vous n'avez besoin de rien au-delà du runtime : JSON.stringify est intégré dans tous les navigateurs et Node.js, sans aucune installation. Si vous avez juste besoin d'un résultat rapide sans écrire de code, le Formateur JSON de ToolDeck le fait instantanément. Ce guide couvre tout ce qui est pratique : le paramètre space, les tableaux et fonctions replacer, la gestion de Date, BigIntet des références circulaires, la lecture et l'écriture de fichiers JSON dans Node.js (18+), le formatage en ligne de commande, et la bibliothèque fast-json-stringify pour la sérialisation en production.
- ✓JSON.stringify(data, null, 2) est intégré dans tous les navigateurs et Node.js — sans installation.
- ✓Le paramètre replacer accepte un tableau (liste blanche de clés) ou une fonction (transformer des valeurs) — utilisez-le pour masquer les champs sensibles.
- ✓Les objets Date se sérialisent automatiquement via toJSON() → chaîne ISO 8601 ; BigInt lève TypeError et nécessite un replacer personnalisé.
- ✓Les références circulaires lèvent TypeError — corrigez avec un Set seen dans une fonction replacer, ou utilisez la bibliothèque flatted.
- ✓Pour le formatage en CLI, utilisez node -p "JSON.stringify(require('./file.json'),null,2)" — aucun outil supplémentaire nécessaire.
Qu'est-ce que le formatage JSON ?
Le formatage JSON (aussi appelé pretty-printing) transforme une chaîne JSON compacte et minifiée en une présentation lisible avec une indentation cohérente et des sauts de ligne. Les données sous-jacentes sont identiques — seuls les espaces blancs changent. Le JSON compact est optimal pour le transfert réseau où chaque octet compte ; le JSON formaté est optimal pour le débogage, la revue de code et l'inspection des logs. La fonction JSON.stringify() de JavaScript gère les deux en un seul appel en faisant varier le paramètre space.
{"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() — Le formateur intégré
JSON.stringify() est une fonction globale dans tout environnement JavaScript — navigateurs, Node.js, Deno, Bun — sans import nécessaire. Son troisième argument, space, contrôle l'indentation : passez un nombre pour autant d'espaces par niveau, ou la chaîne '\t' pour des tabulations. L'omettre (ou passer null) produit une sortie compacte sur une seule ligne.
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
// }
// }Le paramètre spaceaccepte soit un nombre (1–10 espaces) soit une chaîne. Passer un caractère de tabulation produit une sortie que beaucoup d'éditeurs et d'outils de diff préfèrent. Vous pouvez aussi combiner les trois paramètres — voici un pattern réel que j'utilise pour écrire du JSON formaté dans des fichiers de configuration :
const telemetryEvent = {
eventId: "evt_3c7f9a2b",
service: "checkout-api",
severity: "warn",
latencyMs: 342,
region: "eu-west-1",
tags: ["payment", "timeout", "retry"]
}
// Indentation 2 espaces (la plus courante dans les projets JS)
JSON.stringify(telemetryEvent, null, 2)
// Indentation par tabulation (préférée par certains linters et outils de config)
JSON.stringify(telemetryEvent, null, '\t')
// Compact — sans espaces (pour le transfert réseau)
JSON.stringify(telemetryEvent)
// {"eventId":"evt_3c7f9a2b","service":"checkout-api",...}undefined, les fonctions et les valeurs Symbol sont silencieusement omises de la sortie. Si la valeur d'une propriété est undefined, cette clé n'apparaîtra pas du tout dans la chaîne sérialisée — c'est une source fréquente de bugs lors du logging d'objets avec des champs optionnels.Fonctions replacer — Filtrer et transformer la sortie
Le deuxième argument de JSON.stringify() est le replacer. Il se présente sous deux formes : un tableau qui liste les clés autorisées, ou une fonction appelée pour chaque paire clé/valeur qui peut filtrer, transformer ou expurger des valeurs. J'utilise la forme tableau pour un sous-ensemble rapide, et la forme fonction quand je dois masquer des données sensibles avant de les logger.
Replacer tableau — Liste blanche de clés spécifiques
const order = {
orderId: "ord_8f2a91bc",
customer: {
id: "usr_4421",
email: "t.dupont@exemple.fr",
passwordHash: "bcrypt:$2b$12$XKzV..."
},
items: [{ sku: "HDMI-4K-2M", qty: 2, unitPrice: 12.99 }],
createdAt: "2026-03-10T14:22:00Z"
}
// N'inclure que les champs sûrs dans le log
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 et customer.email sont exclusReplacer fonction — Transformer les valeurs
const auditRecord = {
requestId: "req_7d2e91",
user: { id: "usr_4421", email: "t.dupont@exemple.fr", apiKey: "sk-live-eKx9..." },
action: "update_billing",
timestamp: new Date("2026-03-10T14:22:00Z"),
durationMs: 87
}
function safeReplacer(key, value) {
// Expurger les champs qui ressemblent à des secrets ou des données personnelles
if (key === "apiKey") return "[EXPURGÉ]"
if (key === "email") return value.replace(/(?<=.{2}).+(?=@)/, "***")
return value
}
console.log(JSON.stringify(auditRecord, safeReplacer, 2))
// {
// "requestId": "req_7d2e91",
// "user": { "id": "usr_4421", "email": "t.***@exemple.fr", "apiKey": "[EXPURGÉ]" },
// "action": "update_billing",
// "timestamp": "2026-03-10T14:22:00.000Z",
// "durationMs": 87
// }this défini sur l'objet contenant la clé courante. Le tout premier appel passe une chaîne vide comme clé et la valeur entière en cours de sérialisation — renvoyez-la telle quelle pour poursuivre la sérialisation normale.Gérer les types non sérialisables
Tous les types JavaScript ne correspondent pas proprement à du JSON. Connaître le comportement de chaque type évite les pertes de données silencieuses et les erreurs inattendues en production.
Date — Automatique via toJSON()
Les objets Date implémentent une méthode toJSON() qui renvoie une chaîne ISO 8601. JSON.stringify() appelle toJSON() automatiquement avant la sérialisation, aucun traitement personnalisé n'est donc nécessaire.
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"
// }
// Tout objet avec une méthode toJSON() reçoit le même traitement :
const custom = { toJSON: () => "valeur-personnalisée", hidden: 42 }
JSON.stringify(custom) // '"valeur-personnalisée"'Classes personnalisées — Implémenter toJSON()
N'importe quelle classe peut implémenter une méthode toJSON() et JSON.stringify() l'appellera automatiquement lors de la sérialisation. C'est plus propre qu'un replacer global pour les types de domaine qui apparaissent partout dans votre code.
class Money {
constructor(amount, currency) {
this.amount = amount
this.currency = currency
}
toJSON() {
// Appelé automatiquement par 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 } // Sérialiser comme chaîne simple
}
const invoice = {
invoiceId: new OrderId('inv_8f2a91bc'),
subtotal: new Money(199.00, 'EUR'),
tax: new Money(15.92, 'EUR'),
issuedAt: new Date('2026-03-10T14:22:00Z')
}
JSON.stringify(invoice, null, 2)
// {
// "invoiceId": "inv_8f2a91bc",
// "subtotal": { "amount": 199, "currency": "EUR", "formatted": "EUR 199.00" },
// "tax": { "amount": 15.92, "currency": "EUR", "formatted": "EUR 15.92" },
// "issuedAt": "2026-03-10T14:22:00.000Z"
// }toJSON() a la priorité sur la fonction replacer. Si les deux sont présents, toJSON() s'exécute en premier — le replacer reçoit la valeur déjà convertie, pas l'instance de classe originale.BigInt — TypeError sans replacer
// Ceci lève : TypeError: Do not know how to serialize a BigInt
// JSON.stringify({ sessionId: 9007199254741234n })
// Solution : convertir BigInt en chaîne dans le replacer
function bigIntReplacer(_key, value) {
return typeof value === 'bigint' ? value.toString() : value
}
const metrics = {
requestCount: 9007199254741234n, // dépasse Number.MAX_SAFE_INTEGER
service: "ingestion-worker",
region: "eu-west-1"
}
JSON.stringify(metrics, bigIntReplacer, 2)
// {
// "requestCount": "9007199254741234",
// "service": "ingestion-worker",
// "region": "eu-west-1"
// }Références circulaires — TypeError sans Set seen
// Ceci lève : TypeError: Converting circular structure to JSON
// const node = { id: "n1" }; node.self = node; JSON.stringify(node)
// Solution : suivre les objets vus avec un 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 // circulaire
JSON.stringify(parent, circularReplacer(), 2)
// {
// "id": "node_parent",
// "label": "root",
// "child": { "id": "node_child", "parent": "[Circular]" }
// }
// Alternative : npm install flatted
// import { stringify } from 'flatted'
// stringify(parent) // gère les refs circulaires nativementRéférence des paramètres de JSON.stringify()
Les trois paramètres sont bien supportés dans tous les runtimes JavaScript modernes. Les valeurs par défaut produisent un JSON compact sur une ligne — passez les paramètres explicitement pour une sortie lisible.
Formater du JSON depuis un fichier et une réponse d'API
Dans Node.js (18+), vous devez souvent reformater un fichier de configuration JSON ou afficher joliment une réponse d'API pour le débogage. Les deux patterns utilisent la même approche en deux étapes : analyser le texte brut avec JSON.parse(), puis resérialiser avec JSON.stringify().
Lire et réécrire un fichier de configuration JSON
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 reformaté avec succès')
} catch (err) {
console.error('Échec du reformatage du config :', err.message)
// JSON.parse lève SyntaxError si le fichier contient du JSON invalide
// readFileSync lève ENOENT si le fichier n'existe pas
}Reformatage asynchrone de fichier (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 }
}
// Utilisation
const { keys } = await reformatJson('./config/feature-flags.json')
console.log(`${keys} clés de premier niveau reformatées`)Afficher joliment du JSON depuis une réponse fetch()
Lors de la création ou du débogage d'un client API dans Node.js 18+ ou le navigateur, afficher joliment le corps de la réponse est la façon la plus rapide de comprendre ce que le serveur a renvoyé. Le pattern standard est response.json() (objet analysé) passé dans JSON.stringify(). Si vous avez besoin de la chaîne brute en premier — pour calculer un hash ou la logger verbatim — utilisez response.text() puis JSON.parse().
// Pattern 1 : response.json() → afficher joliment
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')// Pattern 2 : response.text() → analyser → formater
// Utile quand vous voulez logger la réponse brute ET l'afficher joliment
async function inspectRawResponse(url) {
const res = await fetch(url)
const raw = await res.text()
console.log('Longueur de la réponse brute :', raw.length)
try {
const parsed = JSON.parse(raw)
console.log('Formaté :')
console.log(JSON.stringify(parsed, null, 2))
} catch {
console.error('La réponse n'est pas du JSON valide :', raw.slice(0, 200))
}
}Formatage en ligne de commande
Node.js dispose de suffisamment de capacités pour formater du JSON depuis le terminal sans aucun outil supplémentaire. Ces one-liners sont utiles dans les scripts CI, les pipelines de déploiement et les alias shell. Pour un usage interactif encore plus rapide, installez jq — le standard de fait pour la manipulation de JSON en ligne de commande.
# Formater package.json avec node -p (print)
node -p "JSON.stringify(require('./package.json'), null, 2)"
# Formater depuis stdin (compatible pipe, fonctionne en CI)
echo '{"port":3000,"env":"production"}' | node -e "
const d = require('fs').readFileSync(0, 'utf8')
console.log(JSON.stringify(JSON.parse(d), null, 2))
"
# Formater une réponse d'API sauvegardée dans un fichier
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)))
"# Alternative Python (préinstallé sur macOS et la plupart des Linux)
cat api-response.json | python3 -m json.tool
# jq — plus rapide et plus riche en fonctionnalités (brew install jq / apt install jq)
cat api-response.json | jq .
# jq — formater et filtrer en une seule étape
cat api-response.json | jq '.data.users[] | {id, email}'"type": "module" dans package.json), require() n'est pas disponible dans les one-liners. Utilisez --input-type=module et fs.readFileSync à la place, ou basculez sur node -e avec un fragment CommonJS comme indiqué ci-dessus.Si vous n'êtes pas du tout dans le terminal — vous collez une réponse Postman ou un fichier de logs — le Formateur JSON de ToolDeck vous permet de coller, formater et copier en une seule étape avec coloration syntaxique et validation intégrée.
Alternative haute performance — fast-json-stringify
fast-json-stringify génère une fonction de sérialisation dédiée à partir d'un JSON Schema. Comme elle connaît la forme des données à l'avance, elle peut sauter la vérification de types et utiliser la concaténation de chaînes plutôt que la descente récursive — les benchmarks montrent typiquement une amélioration de débit de 2–5× par rapport à JSON.stringify() sur des payloads grands et répétitifs. Je l'utilise dans les routes API à haute fréquence où le coût de sérialisation apparaît dans les traces du profiler.
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 est conçu pour la sérialisation en production de données structurées — il produit toujours une sortie compacte (sans formatage lisible). Pour une sortie lisible pendant le développement, utilisez JSON.stringify(data, null, 2) normalement.Sortie terminal avec coloration syntaxique
La fonction intégrée de Node.js util.inspect() produit une sortie colorée et lisible, optimisée pour l'affichage en terminal. Elle gère les références circulaires et BigInt nativement, et rend récursivement les objets imbriqués à n'importe quelle profondeur. La sortie n'est pas du JSON valide — elle utilise la syntaxe JavaScript (ex. true au lieu de true, mais rend les fonctions et Symbols plutôt que de les omettre), ce qui la rend idéale pour les scripts de débogage Node.js mais inadaptée aux réponses API ou à la sortie fichier.
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 → développer tous les niveaux imbriqués ; colors: true → couleurs ANSI terminal
console.log(inspect(payload, { colors: true, depth: null }))util.inspect() pour du JSON écrit dans des fichiers, envoyé sur le réseau ou stocké en base de données. Sa sortie n'est pas du JSON valide et provoquera des erreurs d'analyse dans tout système aval qui appellera JSON.parse() dessus. Réservez-le exclusivement au débogage interactif en terminal.Travailler avec de grands fichiers JSON
JSON.parse() charge tout le fichier en mémoire avant de l'analyser — correct pour les petits payloads, mais impraticable pour les fichiers de plus de 50–100 Mo tels que des exports de base de données, des dumps de logs applicatifs ou des lots d'analyse. Pour ces cas, les Streams Node.js et la bibliothèque stream-json permettent de traiter les enregistrements un par un sans saturer le heap.
Analyse en streaming avec stream-json
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 = tableau de millions d'objets — jamais chargé entièrement en mémoire
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 — Sans dépendances supplémentaires
NDJSON (Newline Delimited JSON) stocke un objet JSON par ligne et est courant dans les exports Kafka, les sorties BigQuery et les pipelines de logs structurés. Le module intégré readline de Node.js le gère sans aucun paquet tiers.
import { createReadStream } from 'fs'
import { createInterface } from 'readline'
// Format : un objet JSON par ligne (logs, exports Kafka, 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() au streaming quand votre fichier JSON dépasse 50–100 Mo ou lors du traitement d'un flux illimité (Kafka, pipeline de logs). Pour NDJSON / JSON Lines, utilisez readline — aucune dépendance supplémentaire nécessaire.Erreurs courantes
Ces quatre erreurs apparaissent régulièrement dans les revues de code et les rapports de bugs en production. Chacune implique un comportement subtil de JSON.stringify() facile à rater et difficile à déboguer après coup.
Problème : Les propriétés d'objet avec des valeurs undefined sont entièrement omises de la sortie JSON — sans avertissement ni erreur. Cela provoque une perte de données invisible quand des champs optionnels existent sur l'objet.
Solution : Utilisez null pour les valeurs intentionnellement absentes qui doivent apparaître dans la sortie sérialisée. Réservez undefined uniquement aux champs qui doivent être exclus du JSON.
const userProfile = {
userId: "usr_4421",
displayName: "Thomas Dupont",
avatarUrl: undefined, // disparaîtra silencieusement
bio: undefined // disparaîtra silencieusement
}
JSON.stringify(userProfile, null, 2)
// { "userId": "usr_4421", "displayName": "Thomas Dupont" }
// avatarUrl et bio ont disparu — sans avertissementconst userProfile = {
userId: "usr_4421",
displayName: "Thomas Dupont",
avatarUrl: null, // explicitement absent — apparaît dans la sortie
bio: null // explicitement absent — apparaît dans la sortie
}
JSON.stringify(userProfile, null, 2)
// {
// "userId": "usr_4421",
// "displayName": "Thomas Dupont",
// "avatarUrl": null,
// "bio": null
// }Problème : Passer une valeur BigInt à JSON.stringify() lève un TypeError à l'exécution. C'est un crash total, pas une omission silencieuse — il se manifestera en production si un champ numérique dépasse Number.MAX_SAFE_INTEGER.
Solution : Utilisez une fonction replacer qui convertit les valeurs BigInt en chaînes avant la sérialisation. Alternativement, convertissez BigInt en string ou Number dans la couche de données avant de passer à JSON.stringify.
const session = {
sessionId: 9007199254741234n, // littéral BigInt
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"
// }Problème : Les objets qui se référencent eux-mêmes — courants dans les arbres DOM, les listes chaînées et certains ensembles de résultats d'ORM — lèvent un TypeError quand on les passe à JSON.stringify(). L'erreur survient uniquement au moment de la sérialisation, souvent loin de l'endroit où la référence circulaire a été créée.
Solution : Utilisez une fonction replacer avec un WeakSet pour détecter et remplacer les références circulaires, ou installez la bibliothèque flatted comme remplacement direct gérant nativement les structures circulaires.
const dept = { id: "dept_eng", name: "Ingénierie" }
const team = { id: "team_frontend", dept }
dept.teams = [team] // circulaire : 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: "Ingénierie" }
const team = { id: "team_frontend", dept }
dept.teams = [team]
// flatted gère les refs circulaires — note : la sortie est au format flatted, pas JSON standard
stringify(dept)
// Ou utilisez un replacer basé sur WeakSet pour du JSON standard :
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)Problème : Passer une valeur space supérieure à 10 à JSON.stringify() ne lève pas d'erreur — la valeur est silencieusement plafonnée à 10. Les développeurs qui attendent 20 espaces par niveau d'indentation pour des structures profondes n'obtiendront que 10, générant un formatage inattendu dans les fichiers générés.
Solution : L'indentation maximale est de 10 espaces. Pour les structures profondes, préférez une indentation à 2 espaces (la convention la plus répandue dans les projets JavaScript) et comptez sur les éditeurs avec repliement pour la navigation.
const deepConfig = { server: { tls: { certs: { primary: "/etc/ssl/api.pem" } } } }
// On attend 20 espaces d'indentation — mais space est plafonné à 10
JSON.stringify(deepConfig, null, 20)
// Même sortie que JSON.stringify(deepConfig, null, 10)
// Pas d'erreur, pas d'avertissement — tronqué silencieusementconst deepConfig = { server: { tls: { certs: { primary: "/etc/ssl/api.pem" } } } }
// Utilisez 2 (la plupart des projets) ou 4 espaces — ne dépassez jamais 10
JSON.stringify(deepConfig, null, 2)
// {
// "server": {
// "tls": {
// "certs": {
// "primary": "/etc/ssl/api.pem"
// }
// }
// }
// }JSON.stringify vs alternatives — Comparaison rapide
Différentes situations appellent différents outils. JSON.stringify avec un replacer couvre la plupart des cas d'usage en production sans aucune dépendance. util.inspect est le bon choix pour un débogage rapide en terminal quand vous avez besoin d'une sortie colorée et n'avez pas besoin de JSON valide. fast-json-stringify vaut l'investissement dans les routes à fort débit où le profiling révèle un coût de sérialisation ; pour tout le reste, la charge de maintenance du schéma ne vaut pas l'effort.
Questions fréquentes
Comment formater JSON avec indentation en JavaScript ?
Appelez JSON.stringify(data, null, 2) — le troisième argument contrôle l'indentation. Passez 2 ou 4 pour des espaces, ou "\t" pour des tabulations. Aucune importation ni installation n'est nécessaire : JSON est un objet global dans tout environnement JavaScript, y compris les navigateurs et Node.js.
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
// }Que fait le paramètre `space` dans JSON.stringify() ?
Le paramètre space contrôle l'indentation de la sortie. Passez un nombre (1–10) pour autant d'espaces par niveau, ou une chaîne comme "\t" pour un caractère de tabulation. Les valeurs supérieures à 10 sont silencieusement plafonnées à 10. Passer null, 0 ou omettre le paramètre produit un JSON compact sur une seule ligne.
const data = { service: "payments", version: 3, active: true }
JSON.stringify(data, null, 2) // indentation 2 espaces
JSON.stringify(data, null, 4) // indentation 4 espaces
JSON.stringify(data, null, '\t') // indentation par tabulation
JSON.stringify(data) // compact : {"service":"payments","version":3,"active":true}Pourquoi JSON.stringify() renvoie-t-il undefined pour certaines valeurs ?
JSON.stringify omet silencieusement les propriétés d'objets dont les valeurs sont undefined, des fonctions ou des Symbols — ces types n'ont pas de représentation JSON. Si la valeur de premier niveau elle-même est undefined, la fonction renvoie undefined (pas la chaîne "undefined"). Utilisez null plutôt qu'undefined pour les champs optionnels qui doivent apparaître dans la sortie.
const event = {
traceId: "tr_9a2f",
handler: () => {}, // fonction — omise
requestId: undefined, // undefined — omis
sessionId: Symbol("s"), // Symbol — omis
status: "ok"
}
JSON.stringify(event, null, 2)
// { "traceId": "tr_9a2f", "status": "ok" }Comment gérer les objets Date lors du formatage JSON ?
Les objets Date disposent d'une méthode toJSON() intégrée qui renvoie une chaîne ISO 8601, donc JSON.stringify les gère automatiquement. Vous n'avez pas besoin d'un replacer personnalisé pour les dates — la valeur sérialisée sera une chaîne comme "2026-03-10T14:22:00.000Z".
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
// }Comment formater une chaîne JSON (pas un objet) en JavaScript ?
Analysez d'abord la chaîne avec JSON.parse(), puis resérialisez-la avec JSON.stringify(). Les deux appels peuvent être enchaînés en une seule ligne pour un débogage rapide.
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
// }Puis-je utiliser JSON.stringify() dans le navigateur ?
Oui. JSON est un objet global intégré dans tous les navigateurs modernes depuis IE8 — pas besoin de balises script ni d'importations. Ouvrez la console DevTools et appelez JSON.stringify() directement. Il fonctionne de manière identique à la version Node.js, avec la même signature de paramètres et les mêmes limitations concernant BigInt et les références circulaires.
// Fonctionne dans Chrome, Firefox, Safari, Edge — sans importations
const payload = { userId: "usr_7b3c", action: "checkout", cart: ["SKU-001", "SKU-002"] }
copy(JSON.stringify(payload, null, 2)) // copy() est un helper DevToolsJavaScript vous donne le contrôle total — fonctions replacer, toJSON() personnalisé, traitement de gros fichiers dans Node.js. Quand vous avez juste besoin d'inspecter ou de partager un extrait formaté, le Formateur JSON de ToolDeck est le chemin le plus rapide : collez votre JSON et obtenez un résultat formaté et coloré sans aucune configuration d'environnement.
Outils associés
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.