Напишіть програму, яка визначає, чи правильний його вхід 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]+)?
Також пробіл може з’являтися до або після будь-якого з шести структурних символів {}[]:,
ws = [\t\n\r ]*
Майте на увазі наступне:
- Будьте обережні з такими функціями
isspace(). Пробіл в JSON є[\t\n\r ], алеisspace()також розглядає\v(вертикальна вкладка) та\f(форму подачі) як простір. Хоча слово, якеisdigit()може прийняти більше, ніж просто[0-9], повинно бути добре використовувати тут, як ми припускаємо, що вхід знаходиться в ASCII. \x7Fтехнічно є керуючим символом, але JSON RFC не згадує його (він лише згадується[\x00-\x1F]), і більшість парсерів JSON прагнуть приймати\x7Fсимволи в рядках. Через цю неоднозначність рішення можуть вирішити або прийняти їх чи ні.
{key: "value"}вважають недійсним JSON? Це дійсний javascript.