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:
Valid
lubInvalid
. Końcowy znak nowej linii można pominąć.Przykład:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate Invalid
Zasady:
- 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. \x7F
jest technicznie kontrolną postacią, ale JSON RFC o tym nie wspomina (tylko wspomina[\x00-\x1F]
), a większość parserów JSON akceptuje\x7F
znaki 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.Odpowiedzi:
PHP:
297285264253 znakówwynik: 300/300
Jest to pełna, rekurencyjna implementacja gramatyki JSON.
Działa tylko na PHP ≥ 5.3 ze względu na składnię nowdoc (heredoc musiałby podwoić wszystko
\
).Wersja do odczytu:
(jest to ten sam regex, z nazwanymi grupami przechwytywania i rozszerzoną składnią):
źródło
<?php
IMO.Python -
340314299292 znakówwynik
źródło
Scala - 390 znaków
To rozwiązanie nie wymaga myślenia, przy użyciu kombinacji parserów. Napisane w 1 lub 2 minuty, dosłownie. Nie można uzyskać skryptu sprawdzającego, przeglądarka powiedziała, że nie znaleziono serwera.
źródło