Escriba un programa que determine si su entrada es JSON válida .
Entrada: texto ASCII:
[\x00-\x7F]*Nota: si ASCII es problemático, puede usar otra codificación, pero indíquelo en su publicación.
Salida:
ValidoInvalid. Se puede omitir la nueva línea final.Ejemplo:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate InvalidReglas:
- No use una biblioteca de análisis JSON.
- Se permiten soluciones parcialmente correctas, pero mal vistas.
- Publique su puntaje de la suite de prueba (ver abajo).
La solución correcta más corta gana.
Ejecute json-validate-test-suite.sh en su programa y publique su puntaje. Ejemplo:
$ ./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
Recursos:
- json.org : definición concisa de la gramática JSON con imágenes fáciles de seguir.
- RFC 4627 - Especificación JSON
- json-validate.c : una implementación de 200 líneas que pasa la prueba.
La gramática JSON es la siguiente:
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]+)?
Además, el espacio en blanco puede aparecer antes o después de cualquiera de los seis caracteres estructurales {}[]:,
ws = [\t\n\r ]*
Tenga en cuenta lo siguiente:
- Tenga cuidado con funciones como
isspace(). El espacio en blanco en JSON es[\t\n\r ], peroisspace()también trata\v(pestaña vertical) y\f(formulario de alimentación) como espacio. Aunque se dice queisdigit()puede aceptar más que solo[0-9], debería estar bien usarlo aquí, ya que suponemos que la entrada está en ASCII. \x7Ftécnicamente es un carácter de control, pero el RFC de JSON no lo menciona (solo menciona[\x00-\x1F]), y la mayoría de los analizadores JSON tienden a aceptar\x7Fcaracteres en cadenas. Debido a esta ambigüedad, las soluciones pueden elegir aceptarlas o no.

{key: "value"}considera JSON no válido? Es javascript válido.Respuestas:
PHP:
297285264253 caracterespuntuación: 300/300
Esta es una implementación completa y recursiva de la gramática JSON.
Funciona solo en PHP ≥ 5.3 debido a la sintaxis de nowdoc (heredoc habría requerido duplicar todo
\).Versión legible:
(esta es la misma expresión regular, con grupos de captura con nombre y sintaxis extendida):
fuente
<?phpOMI.Python -
340314299292 caracteresPuntuación
fuente
Scala - 390 caracteres
Esta es una solución obvia, utilizando combinadores de analizador sintáctico. Escrito en 1 o 2 minutos, literalmente. No se puede obtener el script de validación, el navegador dijo que el servidor no se encontró.
fuente