编写一个确定其输入是否为有效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
字符串中的字符。由于存在这种歧义,解决方案可能选择接受还是不接受。
7
您的“允许部分正确的解决方案”说明使我梦想从遗传算法中提取正则表达式。我一定疯了
—
JB
@JB:太棒了。
—
乔伊·亚当斯
只是好奇,为什么要
—
2011年
{key: "value"}
考虑使用无效的JSON?这是有效的javascript。
@HoLyVieR:我想这样可以更轻松地解析JSON,并减少实现者的歧义。我不确定我是否也喜欢此限制。
—
乔伊·亚当斯
有人得到了验证脚本的副本吗?
—
Armand 2012年