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.