Aller au contenu
jsonbeautifiers
Français

Validateur JSON

Chaque erreur avec sa ligne, sa colonne, sa cause et sa correction exactes.

Entrée

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 validation répond à une seule question : ce document est-il du JSON légal ? Ce qui est utile, c’est ce qui se passe quand la réponse est non. La plupart des validateurs vous disent qu’un jeton était inattendu et vous laissent le chercher. Celui-ci vous dit quel caractère, à quelle ligne et quelle colonne, ce qu’il attendait à la place, et quoi faire.

Il ne s’arrête pas non plus au premier problème. Un document comportant quatre erreurs en signale quatre, ce qui vous permet de les corriger en une passe plutôt qu’en quatre.

Ce qui est vérifié

La grammaire de la RFC 8259, en entier. Y compris les parties qui surprennent.

Espaces
Exactement quatre caractères sont légaux entre les jetons : espace, tabulation, retour chariot et saut de ligne. Une espace insécable, une espace sans chasse ou une espace idéographique est une erreur de syntaxe, et ce validateur nomme le caractère au lieu de signaler un jeton inattendu. Ils arrivent en permanence quand on copie du JSON depuis une page web, un PDF ou une messagerie.
Nombres
Pas de zéro en tête, pas de plus initial, pas d’hexadécimal, pas de point décimal final, ni NaN ni Infinity. Chaque violation a son propre message, parce que chacune a une cause différente et une correction différente.
Chaînes
Seules neuf séquences d’échappement sont légales. Les caractères de contrôle sous U+0020 doivent être échappés. Les demi-codets isolés sont signalés comme avertissement, car ils s’analysent mais ne survivent pas à un ré-encodage en UTF-8.
Une seule valeur de premier niveau
Un document en contient exactement une. Plusieurs valeurs, une par ligne, c’est du NDJSON, et ce validateur reconnaît cette forme et le dit au lieu de signaler une erreur générique de contenu résiduel.

Avertissements, qui ne sont pas des erreurs

Certaines choses s’analysent et gâchent quand même votre après-midi. Elles sont signalées à part pour ne jamais bloquer votre sortie.

Clés en double
La RFC 8259 dit que les clés DEVRAIENT être uniques et laisse le comportement indéfini quand elles ne le sont pas. JavaScript et Python gardent la dernière, certains analyseurs Go et Java rejettent le document, quelques-uns gardent la première. Vous obtenez la position des deux.
Entiers hors de la plage sûre
Au-dessus de 2^53-1, un nombre JavaScript ne peut pas contenir la valeur exacte. L’avertissement indique la valeur que JSON.parse vous donnerait à la place.
Marque d’ordre des octets
Un U+FEFF en tête est accepté ici et signalé, parce que JSON.parse dans les navigateurs et dans Node le rejette purement et simplement.
Imbrication très profonde
Cet analyseur est itératif et n’a pas de limite de profondeur, mais beaucoup de consommateurs en ont une. Mesuré sur cette machine, V8 refuse de sérialiser une structure de plus de 4 800 niveaux environ : un document que vous pouvez lire peut donc rester un document que vous ne pouvez pas réécrire.

Valider la forme autant que la syntaxe

La validation syntaxique vous dit seulement que le document est bien formé, pas qu’il contient ce que vous attendiez. Pour cela il faut JSON Schema, qui décrit propriétés requises, types et contraintes. Notre générateur de schéma produit un point de départ à partir d’un payload d’exemple.

How to do this in code

Vérifier la validité en code, et en tirer une erreur exploitable.

js JavaScript

Il n’existe pas de validateur sans exception dans la bibliothèque standard, donc le try/catch est l’API.

function validate(text) {
  try {
    JSON.parse(text);
    return { ok: true };
  } catch (e) {
    // Modern V8 includes a (line L column C) suffix in the message.
    return { ok: false, message: e.message };
  }
}
py Python

JSONDecodeError porte msg, lineno, colno, pos et doc, ce qui est plus de structure que n’en donnent la plupart des environnements.

import json

try:
    json.loads(text)
except json.JSONDecodeError as e:
    print(f"{e.msg} at line {e.lineno} column {e.colno} (char {e.pos})")
sh Shell

jq empty analyse l’entrée et n’affiche rien, ce qui en fait un contrôle de validité propre dans un script d’intégration continue.

# jq exits non-zero and prints the position on failure
jq empty input.json

# Python, no extra install
python -m json.tool input.json > /dev/null
go Go

Go signale un décalage en octets plutôt qu’une ligne, il faut donc compter les sauts de ligne soi-même.

if !json.Valid(data) {
    // Valid() gives no position. To get one, decode and
    // inspect the SyntaxError:
    var v any
    if err := json.Unmarshal(data, &v); err != nil {
        var se *json.SyntaxError
        if errors.As(err, &se) {
            line := 1 + bytes.Count(data[:se.Offset], []byte("\n"))
            return fmt.Errorf("%v at line %d", se, line)
        }
    }
}

Questions fréquentes

Pourquoi signale-t-il plusieurs erreurs là où d’autres validateurs n’en signalent qu’une ?
Parce que l’analyseur se rétablit au lieu de s’arrêter. Après avoir signalé un problème, il se resynchronise et continue : un document avec une virgule finale, une chaîne entre apostrophes et une clé non citée signale les trois en une seule passe.
Une chaîne ou un nombre seul est-il du JSON valide ?
Oui, depuis la RFC 7159 en 2014. La RFC 4627 d’origine exigeait que la valeur de premier niveau soit un objet ou un tableau ; la spécification actuelle, la RFC 8259, autorise n’importe quelle valeur. Donc "bonjour", 42 et null sont des documents JSON complets et valides.
Les virgules finales sont-elles parfois autorisées ?
Pas en JSON. Elles le sont en JavaScript, en JSON5 et en JSONC, que VS Code utilise pour ses propres fichiers de configuration. Si votre consommateur accepte le JSONC, vous pouvez les garder ; sinon, l’outil de réparation les retire.
Et les commentaires ?
JSON n’en a aucun, par conception. Douglas Crockford les a retirés délibérément, au motif que les gens s’en servaient pour glisser des directives d’analyse. Utilisez JSONC ou JSON5, ou déplacez la note dans une clé comme "_comment".