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:
Valid
ouInvalid
. A nova linha à direita pode ser omitida.Exemplo:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate Invalid
Regras:
- 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\x7F
caracteres 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.Respostas:
PHP:
297285264253 caracterespontuação: 300/300
Esta é uma implementação completa e recursiva da gramática JSON.
Ele só funciona em PHP ≥ 5,3 devido à nowdoc sintaxe (heredoc teria exigido para dobrar tudo
\
).Versão legível:
(este é o mesmo regex, com grupos de captura nomeados e sintaxe estendida):
fonte
<?php
IMO.Python -
340314299292 caracteresPonto
fonte
Scala - 390 caracteres
Este é um solução simples, usando combinadores de analisador. Escrito em 1 ou 2 minutos, literalmente. Não é possível obter o script validador, o navegador disse que o servidor não foi encontrado.
fonte