Scrivi un programma che determina se il suo input è JSON valido .
Input: testo ASCII:
[\x00-\x7F]*Nota: se ASCII è problematico, sentiti libero di usare un'altra codifica, ma indicalo nel tuo post.
Uscita:
ValidoInvalid. Newline finale può essere omesso.Esempio:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate InvalidRegole:
- Non utilizzare una libreria di analisi JSON.
- Sono consentite soluzioni parzialmente corrette, ma disapprovate.
- Pubblica il tuo punteggio della suite di test (vedi sotto).
I più brevi corrette vince soluzione.
Eseguire json-validate-test-suite.sh sul vostro programma, e inviare il tuo punteggio. Esempio:
$ ./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
risorse:
- json.org - Definizione concisa della grammatica JSON con immagini facili da seguire.
- RFC 4627 - Specifiche JSON
- json-validate.c - Un'implementazione a 200 righe che supera la suite di test.
La grammatica JSON è la seguente:
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]+)?
Inoltre, gli spazi bianchi possono apparire prima o dopo uno dei sei caratteri strutturali {}[]:,
ws = [\t\n\r ]*
Tieni presente quanto segue:
- Fai attenzione a funzioni come
isspace(). Lo spazio bianco in JSON è[\t\n\r ], maisspace()considera anche\v(scheda verticale) e\f(feed modulo) come spazio. Anche se c'è una parola cheisdigit()può accettare più di un semplice[0-9], dovrebbe essere bene usarlo qui, dato che supponiamo che l'input sia in ASCII. \x7Fè tecnicamente un personaggio di controllo, ma l'RFC JSON non lo menziona (menziona solo[\x00-\x1F]) e la maggior parte dei parser JSON tende ad accettare\x7Fcaratteri nelle stringhe. A causa di questa ambiguità, le soluzioni possono scegliere di accettarle o meno.
{key: "value"}considerato JSON non valido? È JavaScript valido.