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:
Valid
oderInvalid
. Nachgestellte Zeilenumbrüche können weggelassen werden.Beispiel:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate Invalid
Regeln:
- 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]
\x7F
ist technisch gesehen ein Steuerzeichen, wird jedoch im JSON-RFC nicht erwähnt (nur erwähnt[\x00-\x1F]
), und die meisten JSON-Parser akzeptieren\x7F
Zeichen 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.Antworten:
PHP:
297285264253 ZeichenPunktzahl: 300/300
Dies ist eine vollständige, rekursive Implementierung der JSON-Grammatik.
Aufgrund der nowdoc- Syntax funktioniert es nur mit PHP ≥ 5.3 (heredoc hätte alles verdoppeln müssen
\
).Lesbare Version:
(Dies ist der gleiche reguläre Ausdruck mit benannten Erfassungsgruppen und erweiterter Syntax):
quelle
<?php
IMO einbeziehen.Python -
340314299292 ZeichenErgebnis
quelle
Scala - 390 Zeichen
Dies ist eine einfache Lösung, die Parser-Kombinatoren verwendet. Im wahrsten Sinne des Wortes in 1 oder 2 Minuten geschrieben. Das Überprüfungsskript kann nicht abgerufen werden. Der Browser hat gemeldet, dass der Server nicht gefunden wurde.
quelle