Réparer du JSON
Corrige virgules finales, apostrophes, commentaires et littéraux Python, avec la liste de chaque changement.
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.