JSON Stringify / Unstringify
Échappez un objet JSON en un littéral de chaîne entre guillemets sur une seule ligne à intégrer dans du code, ou décodez une chaîne JSON échappée en JSON lisible.
1 009 vues
Comment ça fonctionne
Stringify prend du JSON réel et l'échappe en un littéral de chaîne sur une seule ligne, avec guillemets échappés — la forme nécessaire pour intégrer du JSON dans un autre champ JSON, une valeur de configuration ou une constante de chaîne dans le code source. En interne, c'est exactement ce que fait JSON.stringify() en JavaScript : il parcourt la valeur, met les chaînes entre guillemets, échappe les caractères de contrôle et les guillemets imbriqués, puis sérialise objets et tableaux en texte. Unstringify fait l'inverse : collez une chaîne JSON échappée (avec \" et \n) et récupérez du JSON propre, lisible et indenté, ce qui équivaut à appeler JSON.parse() dessus puis à en afficher le résultat de façon formatée.
Exemple concret : l'objet {"name":"Ada","tags":["a","b"]} se transforme, une fois stringifié, en le littéral "{\"name\":\"Ada\",\"tags\":[\"a\",\"b\"]}" — chaque guillemet double interne reçoit une barre oblique inverse devant lui, afin que l'ensemble puisse tenir à l'intérieur d'une seule paire de guillemets externes. C'est exactement ce qui se produit lorsqu'une API enveloppe une charge utile JSON comme une chaîne à l'intérieur d'une autre réponse JSON (le corps d'un webhook, une ligne de log, une colonne de base de données de type texte), ou lorsqu'une valeur JSON doit être déposée dans un fichier YAML, une variable d'environnement, ou une constante de chaîne dans le code source sans casser la syntaxe environnante. Unstringify fait l'inverse : collez ce bloc échappé et récupérez l'original, indenté et lisible.
Quelques comportements de JSON.stringify() méritent d'être connus même si vous ne touchez jamais directement à cet outil : les valeurs undefined et les fonctions sont silencieusement supprimées des propriétés d'un objet (une clé dont la valeur est undefined disparaît purement et simplement), mais ces mêmes valeurs à l'intérieur d'un tableau sont converties en null plutôt que supprimées, car un tableau doit conserver sa longueur et l'ordre de ses index. Les objets Date ne sont pas sérialisés comme des objets — ils sont convertis via leur méthode toJSON() en une chaîne ISO 8601 telle que "2024-01-15T10:30:00.000Z". Et une valeur contenant une référence circulaire — un objet qui, directement ou via une chaîne de propriétés, se réfère à lui-même — ne peut pas être stringifiée du tout : le vrai JSON.stringify() lève une TypeError: Converting circular structure to JSON, car aucune chaîne de longueur finie ne peut représenter une structure infiniment imbriquée.
Ce qu'il faut savoir
La stringification est une opération avec perte dans un sens bien précis : tout ce qui est silencieusement supprimé (fonctions, propriétés undefined, clés Symbol) ne peut pas être récupéré ensuite par unstringify — l'aller-retour ne préserve que ce que du JSON valide peut représenter dès le départ, à savoir des chaînes, des nombres, des booléens, null, des objets simples et des tableaux. Dans du vrai code, JSON.stringify() accepte aussi deux arguments supplémentaires en plus de la valeur elle-même : un replacer (une fonction ou un tableau de noms de clés contrôlant précisément quelles propriétés sont incluses, ou comment leurs valeurs sont transformées avant la sérialisation), et un paramètre space (un nombre ou une chaîne qui transforme la sortie compacte sur une seule ligne en JSON indenté et lisible par un humain — c'est précisément la différence entre une réponse d'API minifiée et la version formatée qu'un débogueur vous affiche).
Le JSON doublement encodé est une source fréquente de confusion : si une valeur ressemble à une chaîne JSON mais que son tout premier caractère est un guillemet et qu'elle est truffée de guillemets internes échappés par des barres obliques inverses, elle a probablement été stringifiée deux fois — une fois par l'application, une autre fois par une couche qui n'a pas réalisé que la charge utile était déjà une chaîne JSON. La faire passer une première fois par unstringify résout la couche externe ; si le résultat semble encore échappé, relancez-le.
Questions fréquentes
Quelle est la différence avec JSON.stringify dans le code ?
La même opération, mais comme outil interactif : collez du JSON réel, obtenez la forme de chaîne échappée que vous produiriez autrement avec JSON.stringify(obj) — utile quand vous n'avez pas de console sous la main.
Pourquoi aurais-je besoin de désérialiser (unstringify) du JSON ?
Les API et les logs imbriquent parfois une chaîne JSON à l'intérieur d'un champ JSON (JSON doublement encodé) — unstringify reconvertit cette chaîne échappée interne en JSON lisible et analysable.
Pourquoi une propriété a-t-elle disparu après la stringification ?
JSON.stringify() omet silencieusement les propriétés d'objet dont la valeur est undefined ou une fonction — aucune des deux n'a de représentation JSON, donc la clé est purement et simplement supprimée plutôt que sérialisée en null. La même valeur undefined à l'intérieur d'un tableau devient null au lieu de disparaître, car les tableaux doivent préserver leur longueur et l'ordre de leurs index.
Pourquoi une erreur de « structure circulaire » apparaît-elle ?
Si un objet se réfère à lui-même, directement ou via une chaîne d'autres objets, JSON.stringify() ne peut pas produire de chaîne finie pour le représenter et lève une TypeError. C'est fréquent lors de la sérialisation d'objets qui conservent une référence arrière vers leur parent (un nœud enfant pointant vers son arbre, un élément DOM, une instance de classe avec un champ « self ») — la solution consiste à retirer ou remplacer la propriété circulaire avant la sérialisation, souvent à l'aide d'une fonction replacer.
Mes données sont-elles envoyées quelque part ?
Non — les deux sens s'exécutent localement dans votre navigateur.
Outils similaires
Signaler un problème
JSON Stringify / Unstringify
Commentaires
Pas encore de commentaires — soyez le premier à en écrire un !