Напишите программу, которая определяет, является ли ее ввод действительным 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.Ответы:
PHP:
297285264253 символаоценка: 300/300
Это полная рекурсивная реализация грамматики JSON.
Он работает только на PHP ≥ 5.3 из-за синтаксиса nowdoc (heredoc должен был бы удвоить все
\
).Читаемая версия:
(это то же самое регулярное выражение с именованными группами захвата и расширенным синтаксисом):
источник
<?php
ИМО.Питон -
340314299292 символовГол
источник
Скала - 390 символов
Это не просто, с помощью комбинаторов синтаксического анализа. Написано буквально за 1 или 2 минуты. Невозможно получить скрипт валидатора, браузер сказал, что сервер не найден.
источник