Écrivez un programme qui détermine si son entrée est JSON valide .
Entrée: texte ASCII:
[\x00-\x7F]*Remarque: si ASCII est problématique, n'hésitez pas à utiliser un autre encodage, mais indiquez-le dans votre message.
Sortie:
ValidouInvalid. Le retour à la ligne peut être omis.Exemple:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate InvalidRègles:
- N'utilisez pas de bibliothèque d'analyse JSON.
- Des solutions partiellement correctes sont autorisées, mais désapprouvées.
- Publiez votre score de suite de tests (voir ci-dessous).
La solution correcte la plus courte l' emporte.
Veuillez exécuter json-validate-test-suite.sh sur votre programme et publier votre score. Exemple:
$ ./json-validate-test-suite.sh ./buggy-prog
fail: should be invalid: [ 0.1e ]
fail: should be invalid: [ 0.1e+-1 ]
fail: should be invalid: [ 0.1e-+1 ]
score: 297/300
Ressources:
- json.org - Définition concise de la grammaire JSON avec des images faciles à suivre.
- RFC 4627 - Spécification JSON
- json-validate.c - Une implémentation de 200 lignes qui réussit la suite de tests.
La grammaire JSON est la suivante:
json: object | array
object: '{' members? '}'
members: pair (',' pair)*
pair: string ':' value
array: '[' elements? ']'
elements: value (',' value)*
value: string
| number
| object
| array
| 'true'
| 'false'
| 'null'
string: '"' char* '"'
char: [^"\\\x00-\x1F]
| '\' escape
escape: ["\\/bfnrt]
| u [0-9A-Fa-f]{4}
number: '-'? (0 | [1-9][0-9]*) ('.' [0-9]+)? ([Ee] [+-]? [0-9]+)?
En outre, un espace peut apparaître avant ou après l'un des six caractères structurels {}[]:,
ws = [\t\n\r ]*
Gardez à l'esprit les points suivants:
- Soyez prudent avec des fonctions comme
isspace(). L'espace dans JSON est[\t\n\r ], maisisspace()traite également\v(onglet vertical) et\f(flux de formulaire) comme un espace. Bien que le motisdigit()puisse accepter plus que juste[0-9], il devrait être acceptable de l'utiliser ici, car nous supposons que l'entrée est en ASCII. \x7Fest techniquement un caractère de contrôle, mais le RFC JSON ne le mentionne pas (il mentionne seulement[\x00-\x1F]), et la plupart des analyseurs JSON ont tendance à accepter les\x7Fcaractères dans les chaînes. En raison de cette ambiguïté, les solutions peuvent choisir de les accepter ou non.
{key: "value"}considérer JSON invalide? C'est du javascript valide.