Schreiben Sie ein Programm, das feststellt, ob seine Eingabe JSON- gültig ist .
Eingabe: ASCII-Text:
[\x00-\x7F]*Hinweis: Wenn ASCII problematisch ist, können Sie eine andere Codierung verwenden, diese jedoch in Ihrem Beitrag angeben.
Ausgabe:
ValidoderInvalid. Nachgestellte Zeilenumbrüche können weggelassen werden.Beispiel:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate InvalidRegeln:
- Verwenden Sie keine JSON-Analysebibliothek.
- Teilkorrekte Lösungen sind erlaubt, aber verpönt.
- Veröffentlichen Sie Ihre Testsuite (siehe unten).
Die kürzeste richtige Lösung gewinnt.
Bitte führen Sie json-validate-test-suite.sh in Ihrem Programm aus und geben Sie Ihre Punktzahl ein. Beispiel:
$ ./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
Ressourcen:
- json.org - Kurze Definition der JSON-Grammatik mit leicht verständlichen Bildern.
- RFC 4627 - JSON-Spezifikation
- json-validate.c - Eine Implementierung mit 200 Zeilen, die die Testsuite besteht.
Die JSON-Grammatik lautet wie folgt:
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]+)?
Außerdem kann vor oder nach den sechs Strukturzeichen ein Leerzeichen stehen {}[]:,
ws = [\t\n\r ]*
Beachten Sie Folgendes:
- Seien Sie vorsichtig mit Funktionen wie
isspace(). Whitespace in JSON ist[\t\n\r ],isspace()behandelt aber auch\v(vertikale Registerkarte) und\f(Formularvorschub) als Leerzeichen. Obwohl Word es hat, das mehr als nur akzeptierenisdigit()kann , sollte es in Ordnung sein, es hier zu verwenden, da wir davon ausgehen, dass die Eingabe in ASCII erfolgt.[0-9] \x7Fist technisch gesehen ein Steuerzeichen, wird jedoch im JSON-RFC nicht erwähnt (nur erwähnt[\x00-\x1F]), und die meisten JSON-Parser akzeptieren\x7FZeichen in Zeichenfolgen. Aufgrund dieser Mehrdeutigkeit können die Lösungen entscheiden, ob sie diese akzeptieren oder nicht.
{key: "value"}JSON für ungültig erklärt? Es ist gültiges Javascript.