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:
Valid
oInvalid
. Se puede omitir la nueva línea final.Ejemplo:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate Invalid
Reglas:
- 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. \x7F
té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\x7F
caracteres 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
<?php
OMI.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