Aller au contenu
jsonbeautifiers
Français

Réparer du JSON

Corrige virgules finales, apostrophes, commentaires et littéraux Python, avec la liste de chaque changement.

Filtrer avec JSONPath

Syntaxe RFC 9535. Le résultat remplace le panneau depuis lequel vous avez ouvert cette fenêtre.

 

Rien de ce que vous collez ne quitte votre navigateur. La liste d’autorisation connect-src en fait une garantie du navigateur plutôt qu’une promesse. Vérifiez-le vous-même

La réparation prend quelque chose de presque-JSON et le rend valide. Virgules finales, apostrophes, clés non citées, commentaires, littéraux Python, guillemets typographiques, crochets non fermés, espaces invisibles.

La sortie n’est pas la partie intéressante. Le journal des changements l’est. Un outil de réparation qui réécrit votre payload en silence est pire que pas d’outil du tout, parce que vous ne pouvez pas savoir ce qu’il a décidé à votre place. Chaque changement est listé avec sa ligne et sa colonne, et ceux qui ont demandé un arbitrage sont listés à part de ceux qui n’en demandaient pas.

Ce qu’il corrige sans avoir à deviner

Ces cas n’ont qu’une seule interprétation raisonnable, ils sont donc appliqués sans autre commentaire que l’entrée du journal.

Virgules finales et doublées
Supprimées. Légales en JavaScript et en JSON5, jamais en JSON.
Chaînes entre apostrophes
Converties en guillemets doubles, avec un ré-échappement du contenu pour qu’une apostrophe à l’intérieur ne casse pas le résultat.
Clés non citées
Mises entre guillemets. JavaScript accepte des identifiants nus comme clés ; JSON non.
Commentaires
Supprimés, sous les deux formes // et /* */.
Littéraux Python
True, False et None deviennent true, false et null.
Guillemets typographiques
Les guillemets courbes produits par la correction automatique deviennent des guillemets ASCII droits.
Espaces invalides
Les espaces insécables et leurs cousines deviennent des espaces ordinaires ; les caractères de largeur nulle sont supprimés.
Marque d’ordre des octets
Retirée du début du document.
Virgules et deux-points manquants
Insérés là où la grammaire rend l’intention non ambiguë.
Caractères de contrôle bruts dans les chaînes
Échappés, de sorte qu’un saut de ligne littéral devient \n.

Ce qu’il signale comme un arbitrage

Ceux-ci changent le sens, et aucune valeur par défaut ne convient à tout le monde. Ils sont appliqués, listés à part, et configurables.

Zéros en tête
Par défaut la valeur est mise entre guillemets : 02134 devient la chaîne "02134". Dans des données réelles, un zéro en tête est presque toujours un code postal, un numéro de compte ou une référence produit, où le retirer détruit la valeur en silence. Si c’est réellement un nombre, passez la règle sur « convertir en nombre » et il devient 2134.
NaN, Infinity et undefined
Convertis en null, ce que substituent la plupart des encodeurs. Python émet NaN et Infinity depuis json.dumps par défaut ; passez allow_nan=False pour l’attraper à la source.
Mots nus utilisés comme valeurs
Mis entre guillemets. {"status": pending} devient {"status": "pending"}, ce qui est généralement juste et occasionnellement non.
Crochets non fermés
Fermés à la fin du document. Si le fichier était tronqué plutôt que mal tapé, cela produit un JSON valide auquel il manque des données : le changement est donc toujours listé.
NDJSON
Plusieurs valeurs complètes, une par ligne, sont encapsulées dans un tableau par défaut. Vous pouvez aussi ne garder que le premier enregistrement, ou ne rien changer à l’entrée.

Ce qu’il ne fera pas

Il n’inventera pas de structure. Si l’entrée n’est pas assez proche du JSON, la réparation échoue et indique quelles erreurs elle n’a pas pu résoudre, plutôt que de produire quelque chose qui s’analyse mais ne veut rien dire.

Il exécute aussi un nombre borné de passes. Chaque passe peut révéler un problème que la précédente masquait, mais le processus converge au lieu de boucler.

How to do this in code

Le faire en code, avec la réserve honnête suivante : analyser de façon permissive côté consommateur signifie généralement que quelque chose en amont produit du mauvais JSON et va continuer à en produire.

py Python, repr de dict

ast.literal_eval n’évalue que des structures littérales : contrairement à eval, il ne peut pas exécuter de code arbitraire.

import ast, json

# A Python dict printed with str() or print() is not JSON.
text = "{'name': 'Priya', 'active': True}"

value = ast.literal_eval(text)   # safe: literals only, no eval
clean = json.dumps(value)        # '{"name": "Priya", "active": true}'
js JavaScript, JSON5

JSON5 est un sur-ensemble doté d’une vraie spécification, ce qui en fait une meilleure cible qu’un analyseur permissif improvisé.

import JSON5 from 'json5';

// Accepts comments, trailing commas, unquoted keys, single
// quotes, hex numbers and more.
const value = JSON5.parse(text);
const strict = JSON.stringify(value);
ts TypeScript, JSONC
import { parse } from 'jsonc-parser';

// What VS Code uses for its own settings files: comments and
// trailing commas, and nothing else.
const errors: ParseError[] = [];
const value = parse(text, errors);
sh Shell
# Strip comments and trailing commas with jq's relaxed reader
jq --args . <<< "$text"

# Or normalise a JSON5 file
npx json5 -c config.json5 > config.json

Questions fréquentes

La réparation modifiera-t-elle mes données ?
Uniquement de la façon décrite dans les arbitrages, et chacun d’eux figure dans le journal avec sa ligne et sa colonne. Les réparations sûres ne touchent que la syntaxe. Si un arbitrage ne vous convient pas, changez le réglage et relancez.
Pourquoi 02134 devient-il une chaîne plutôt que le nombre 2134 ?
Parce que mettre entre guillemets ne perd rien et retirer les zéros si. Dans des données réelles, les zéros en tête sont presque toujours significatifs, et un convertisseur qui transformerait silencieusement un code postal en un nombre plus petit ferait exactement le genre de dégât discret que ce site existe pour éviter. L’option de retrait est à un clic.
Il dit qu’il n’a pas pu réparer mon document. Et maintenant ?
Passez-le au validateur. La réparation ne traite que les problèmes ayant une correction non ambiguë ; un document à la structure réellement irrécupérable demande qu’un humain décide de ce qui était voulu.