我有一个需要验证部分输入(请参阅下文)是否为有效JSON的场景?我已引用此answer来确定给定的字符串是否为有效的JSON。
示例输入:
{
"JSON": [{
"foo":"bar",
"details": {
"name":"bar",
"id":"bar",
到目前为止我尝试过的:
/ (?(DEFINE)
(?<number> -? (?= [1-9]|0(?!\d) ) \d+ (\.\d+)? ([eE] [+-]? \d+)? )
(?<boolean> true | false | null )
(?<string> " ([^"\n\r\t\\\\]* | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* " )
(?<array> \[ (?: (?&json) (?: , (?&json) )* )? \s* \]{0,1} )
(?<pair> \s* (?&string) \s* : (?&json) )
(?<object> \{ (?: (?&pair) (?: , (?&pair) )* )? \s* \}{0,1} )
(?<json> \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* )
) \A (?&json)\,{0,1} \Z /six
我使关闭数组和对象成为可选操作(允许零或一次)。但是在某些情况下,这将失败,例如,当您打开一个对象而不关闭另一个对象(如下所示)时,正则表达式仍会找到匹配项。
无效,但仍然匹配:
{
"JSON": [{
"foo":"bar",
"details": {
"name":"bar",
"id":"bar",{
如何验证部分JSON输入?
这不是对您的问题的答案,如果注释形式允许的字符数足够,那么注释的形式就应该是。JSON不是常规语言,因此不能仅由正则表达式引擎识别(如果您使用Python编程,regex
程序包提供了扩展,可能使您可以完成任务,但是我所说的通常是正确)。
如果解析器生成器不支持您的首选语言,则可以考虑创建一个简单的递归下降解析器。您已经定义的正则表达式将非常适合您创建令牌,该令牌将成为该解析器的输入。当然,您会期望会发生解析错误-但应该在输入令牌作为文件结束令牌时发生。在扫描文件结束令牌之前发生的分析错误提示您
not
拥有有效JSON的前缀。如果您使用的是自下而上的,减少移位的解析器,例如使用YACC生成的解析器,则这将是文件末尾标记以外的其他内容的移位错误。