~/tools / LLM JSON Repair
LLM JSON Repair — Réparez le JSON cassé renvoyé par une IA
Réparez le quasi-JSON que renvoient les modèles d'IA : l'outil retire les blocs de code et le bavardage, supprime les virgules finales et les commentaires, corrige les guillemets, les clés et les valeurs Python, puis liste précisément ce qu'il a modifié. Rien ne quitte votre navigateur.
Seules les corrections qui n'ont qu'une réponse possible sont appliquées. Le reste est signalé avec sa position, sans être deviné.
Tout s'exécute dans votre navigateur. Le texte collé n'est pas envoyé.
Les modèles de langage enveloppent souvent le JSON dans un bloc de code et une phrase, puis abîment la syntaxe : une virgule finale, des guillemets simples, un commentaire, True au lieu de true. JSON.parse rejette tout cela. Cet outil repère le JSON dans le texte et ne répare que les problèmes qui n'ont qu'une seule correction évidente, puis liste chaque modification pour que vous puissiez en juger. Si la sortie a été coupée, il ferme ce qui est resté ouvert et vous avertit que des données peuvent manquer. Il ne devine pas : un texte qu'il ne sait pas réparer est signalé avec sa position au lieu d'être modifié en silence.
Cas d'usage
- Corriger la réponse d'un modèle avant de la passer à JSON.parse ou de l'enregistrer dans un fichier de configuration
- Nettoyer une réponse où le JSON est entouré d'un bloc de code et d'une explication
- Vérifier ce qui a changé, pour qu'une valeur réparée ne passe pas en production sans que personne s'en aperçoive
Utilisation
- Collez la réponse du modèle, ou chargez l'exemple.
- Lisez le JSON réparé et la liste des modifications placée en dessous.
- Copiez le résultat. Les modifications en orange peuvent faire perdre de l'information : vérifiez-les.
Ce qui compte comme JSON valide
- Les chaînes et les noms de membres n'utilisent que des guillemets doubles. Les guillemets simples ne font pas partie de la grammaire.
- Il n'y a pas de commentaires. Le seul remplissage autorisé est l'espace blanc.
- Une virgule se place uniquement entre des membres ou des éléments : une virgule finale n'est donc pas autorisée.
- Une valeur est un objet, un tableau, un nombre ou une chaîne, ou l'un de false, null et true. Infinity, NaN et undefined ne sont pas des valeurs JSON.
- Les nombres ne peuvent pas avoir de zéro de tête ni de + initial, et un point décimal exige des chiffres de chaque côté : 012, +5, .5 et 5. sont donc tous invalides.
- Les caractères de contrôle U+0000 à U+001F dans une chaîne doivent être échappés : un saut de ligne brut dans une chaîne est donc invalide.
- Le niveau supérieur peut être n'importe quelle valeur, pas seulement un objet ou un tableau.
Comment la sortie d'un modèle se casse d'habitude
| Problème | Exemple | Ce que fait cet outil |
|---|---|---|
| Bloc de code et bavardage | Sure! ```json { … } ``` Hope this helps | Ne garde que le JSON |
| Virgule finale | [1, 2,] | Supprime la virgule |
| Commentaire | {"a": 1 // note} | Supprime le commentaire |
| Guillemets simples | {'a': 'b'} | Utilise des guillemets doubles |
| Clé nue | {a: 1} | Met la clé entre guillemets |
| Valeurs Python | {"ok": True, "x": None} | Écrit true et null |
| Saut de ligne brut dans une chaîne | "line one⏎line two" | L'échappe en \n |
| NaN ou undefined | {"x": NaN} | Écrit null et avertit que la valeur est perdue |
| Réponse coupée | {"items": [{"id": 1}, {"id": | Ferme ce qui est ouvert et avertit que des données peuvent manquer |
Ce qui se répare sans risque, et ce qui ne le peut pas
Une réparation est sûre quand le texte cassé n'a qu'une seule lecture raisonnable. Une virgule finale, un commentaire ou un bloc de code peuvent être supprimés sans changer ce que disent les données. D'autres changements modifient le sens : ils sont donc signalés et vous devez les vérifier. Fermer une réponse coupée donne un JSON valide auquel il manque des données, et transformer NaN en null jette la valeur d'origine.
Deux limites viennent de JSON lui-même. La RFC 8259 dit que les noms au sein d'un objet devraient être uniques et que le comportement des logiciels est imprévisible quand ils ne le sont pas ; cet outil garde le dernier, comme JSON.parse. La RFC dit aussi que les logiciels interopèrent bien quand ils n'attendent pas plus d'étendue ni de précision qu'un double IEEE 754. Cet outil conserve les nombres tels que vous les avez écrits, mais un programme qui lit un très grand entier dans un double l'arrondit. Les entiers compris entre -(2^53)+1 et (2^53)-1 sont exacts.
Mieux : demander une sortie structurée à l'API
La réparation est un dernier recours. Les API de modèles peuvent contraindre la sortie à un schéma, et les trois éditeurs le documentent différemment.
- OpenAI : Structured Outputs fait générer au modèle des réponses conformes à votre schéma JSON, alors que le mode JSON garantit seulement un JSON valide. Un refus peut ne pas suivre le schéma, et une réponse qui atteint la limite maximale de jetons est incomplète (statut incomplete, raison max_output_tokens).
- Anthropic : les sorties structurées utilisent un décodage contraint pour que la réponse suive votre schéma, et la documentation précise que cela vaut dans la plupart des cas. Un refus (stop_reason refusal) ou une réponse coupée par max_tokens peut ne pas correspondre au schéma : vérifiez donc stop_reason avant d'analyser la réponse.
- Google Gemini : le modèle est configuré pour produire un JSON conforme au schéma que vous fournissez. La justesse sémantique n'est pas garantie, validez donc les valeurs, et certaines contraintes comme minLength et maxLength ne sont pas appliquées.
Aucune des trois documentations ne promet un JSON valide lorsque la sortie est coupée. Vérifiez pourquoi le modèle s'est arrêté avant de vous fier à un résultat analysé.
Sources (vérifiées le 2026-10-23): RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format / OpenAI: Structured Outputs / Anthropic: Structured outputs / Google AI for Developers: Structured output
FAQ
Que corrige-t-il ?
Il retire le bloc de code et le texte autour du JSON ; supprime les virgules finales et les commentaires // ou /* */ ; transforme les guillemets simples et typographiques en guillemets doubles ; met entre guillemets les clés nues ; remplace True, False et None par true, false et null ; ajoute les virgules manquantes entre les lignes ; échappe les sauts de ligne bruts à l'intérieur des chaînes ; et réécrit des nombres tels que +5, .5 et 0x1F sous forme de nombres JSON valides.
Que ne modifie-t-il jamais ?
Les valeurs. Les chaînes sont conservées caractère pour caractère et les nombres gardent leurs chiffres : un long identifiant comme 12345678901234567890 n'est donc pas arrondi. Pour les clés en double, il suit JSON.parse : la dernière l'emporte.
Et si la réponse a été coupée ?
Il ferme les chaînes, tableaux et objets restés ouverts, et supprime une clé qui n'a pas encore de valeur. Le texte devient valide sans être complet, et le résultat est donc signalé comme pouvant manquer de données. Demandez au modèle de continuer, ou relevez sa limite de sortie, plutôt que de vous fier à un résultat tronqué.
Pourquoi NaN ou undefined est-il devenu null ?
JSON ne connaît ni NaN, ni Infinity, ni undefined. L'outil écrit null à leur place et le signale, car la valeur d'origine est perdue.
Pourquoi refuse-t-il certains textes ?
Quand il n'existe pas de correction unique et évidente, par exemple des points de suspension (...) à la place d'éléments omis, ou un mot nu là où une valeur est attendue, il s'arrête et indique l'endroit, au lieu de deviner.
Le texte est-il envoyé à un serveur ?
Non. La réparation s'exécute dans votre navigateur.