É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:
Valid
ouInvalid
. Le retour à la ligne peut être omis.Exemple:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate Invalid
Rè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. \x7F
est 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\x7F
caractè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.Réponses:
PHP:
297285264253 caractèresscore: 300/300
Il s'agit d'une implémentation complète et récursive de la grammaire JSON.
Il ne fonctionne que sur PHP ≥ 5.3 en raison de Nowdoc syntaxe (heredoc aurait fallu doubler tous
\
).Version lisible:
(c'est le même regex, avec des groupes de capture nommés et une syntaxe étendue):
la source
<?php
OMI.Python -
340314299292 caractèresBut
la source
Scala - 390 caractères
Il s'agit d'un soluton simple, utilisant des combinateurs d'analyseurs. Écrit en 1 ou 2 minutes, littéralement. Impossible d'obtenir le script de validation, le navigateur a indiqué que le serveur était introuvable.
la source