Napisz program, który określi, czy jego dane wejściowe są poprawne JSON .
Dane wejściowe: tekst ASCII:
[\x00-\x7F]*Uwaga: jeśli ASCII jest problematyczne, możesz użyć innego kodowania, ale zaznacz to w swoim poście.
Wyjście:
ValidlubInvalid. Końcowy znak nowej linii można pominąć.Przykład:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate InvalidZasady:
- Nie używaj biblioteki parsującej JSON.
- Częściowo poprawne rozwiązania są dozwolone, ale nie są mile widziane.
- Zamieść swój wynik testu (patrz poniżej).
W najkrótsze poprawne wygrywa rozwiązanie.
Proszę uruchomić json-validate-test-suite.sh od programu, a po swój wynik. Przykład:
$ ./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
Zasoby:
- json.org - Zwięzła definicja gramatyki JSON z łatwymi do naśladowania obrazkami.
- RFC 4627 - specyfikacja JSON
- json-validate.c - 200-wierszowa implementacja, która przechodzi testsuite.
Gramatyka JSON jest następująca:
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]+)?
Również białe znaki mogą pojawiać się przed dowolnym z sześciu znaków strukturalnych lub po nim {}[]:,
ws = [\t\n\r ]*
Pamiętaj, że:
- Uważaj na funkcje takie jak
isspace(). Białe znaki w JSON są[\t\n\r ], aleisspace()także traktują\v(tabulacja pionowa) i\f(feed feed) jako spację. Chociaż słowo ma to, żeisdigit()może zaakceptować więcej niż tylko[0-9], powinno być w porządku, aby użyć tutaj, ponieważ zakładamy, że dane wejściowe są w ASCII. \x7Fjest technicznie kontrolną postacią, ale JSON RFC o tym nie wspomina (tylko wspomina[\x00-\x1F]), a większość parserów JSON akceptuje\x7Fznaki w ciągach. Z powodu tej dwuznaczności rozwiązania mogą je zaakceptować lub nie.
{key: "value"}uważa się za nieprawidłowy JSON? To jest poprawny javascript.