入力が有効なJSONかどうかを判断するプログラムを作成します。
入力: ASCIIテキスト:
[\x00-\x7F]*注:ASCIIに問題がある場合は、別のエンコードを使用しても構いませんが、投稿でそれを示してください。
出力:
ValidまたはInvalid。末尾の改行は省略できます。例:
$ echo '{"key": "value"}' | ./json-validate Valid $ echo '{key: "value"}' | ./json-validate Invalidルール:
- JSON解析ライブラリを使用しないでください。
- 部分的に正しいソリューションは許可されますが、眉をひそめます。
- テストスイートのスコアを投稿します(以下を参照)。
最短正しいですソリューションの勝利。
プログラムでjson-validate-test-suite.shを実行し、スコアを投稿してください。例:
$ ./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
リソース:
- json.org-わかりやすい写真を使用したJSON文法の簡潔な定義。
- RFC 4627 -JSON仕様
- json-validate.c-テストスイートに合格する200行の実装。
JSONの文法は次のとおりです。
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]+)?
また、空白は、6つの構造文字の前または後に表示できます。 {}[]:,
ws = [\t\n\r ]*
次のことに注意してください。
- などの関数には注意してください
isspace()。JSONに空白がある[\t\n\r ]が、isspace()また、おやつ\v(垂直タブ)と\f空間として(改)。wordには、以上のものisdigit()を受け入れる[0-9]ことができるものがありますが、入力はASCIIであると想定しているため、ここで使用しても大丈夫です。 \x7F技術的には制御文字ですが、JSON RFCはそれを言及しておらず(言及しているだけです[\x00-\x1F])、ほとんどのJSONパーサーは\x7F文字列の文字を受け入れる傾向があります。このあいまいさのため、ソリューションはそれらを受け入れるかどうかを選択できます。
7
あなたの「許可された部分的に正しい解」のメモは、遺伝的アルゴリズムから正規表現を抽出する夢を私に与えています。私は非常識でなければなりません。
—
JB
@JB:それは素晴らしいことです。
—
ジョーイアダムス
好奇心が強い、なぜ
—
-HoLyVieR
{key: "value"}無効なJSONを考慮するのですか?有効なjavascriptです。
@HoLyVieR:JSONの解析が容易になり、実装者にとって曖昧さが少なくなると思います。私もこの制限が好きかどうかわかりません。
—
ジョーイアダムス
誰でも検証スクリプトのコピーを手に入れましたか?
—
アルマン