Escreva um programa que determine se sua entrada é JSON válida .
Entrada: texto ASCII:
[\x00-\x7F]*Nota: se o ASCII for problemático, fique à vontade para usar outra codificação, mas indique-a na sua postagem.
Saída:
ValidouInvalid. A nova linha à direita pode ser omitida.Exemplo:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate InvalidRegras:
- Não use uma biblioteca de análise JSON.
- Soluções parcialmente corretas são permitidas, mas desaprovadas.
- Poste sua pontuação na suíte de testes (veja abaixo).
A menor solução correta vence.
Por favor, execute json-validate-test-suite.sh no seu programa e publique sua pontuação. Exemplo:
$ ./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 - Definição concisa da gramática JSON com imagens fáceis de seguir.
- RFC 4627 - especificação JSON
- json-validate.c - Uma implementação de 200 linhas que passa no testinguite.
A gramática JSON é a seguinte:
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]+)?
Além disso, o espaço em branco pode aparecer antes ou depois de qualquer um dos seis caracteres estruturais {}[]:,
ws = [\t\n\r ]*
Tenha em mente o seguinte:
- Tenha cuidado com funções como
isspace(). O espaço em branco no JSON é[\t\n\r ], masisspace()também trata\v(guia vertical) e\f(alimentação do formulário) como espaço. Embora exista uma palavra queisdigit()possa aceitar mais do que apenas[0-9], convém usar aqui, pois assumimos que a entrada está em ASCII. \x7Fé tecnicamente um caractere de controle, mas o JSON RFC não o menciona (apenas menciona[\x00-\x1F]), e a maioria dos analisadores JSON costuma aceitar\x7Fcaracteres em strings. Devido a essa ambiguidade, as soluções podem optar por aceitá-las ou não.
{key: "value"}considerar JSON inválido? É javascript válido.