用于定义JSON解析的规则的编程语言或技术



我面临以下方案。我目前正在撰写有关JSON-FILE的验证机制,以验证是否满足了几个约束。对于此任务,我想知道,这可能是使用的最佳工具,我会为任何合适的建议感到高兴。

现在,你们中有些人可能想在这里提及,JSON-SCHEMA验证器的使用可能是我正在搜索的内容,但我个人认为它与我的用例不符。

让我给你一个例子:

{ 
    "document" : {
         "Type" : "A",
         "Action" : [ "ActionA",
                      "ActionB",
                      "ActionC"
                    ]
    } 
}

对于上层简化的文档,我想定义验证规则,该规则会产生错误或提示,以防万一。

规则可以(以抽象的方式)将其描述为这样的东西:

  • 如果文档在操作中具有类型" A"one_answers" ActionB",则投掷错误
  • 如果文档具有" b"类型,则投掷错误
  • 如果文档没有类型,请扔错误
  • 如果文档具有" C"类型,而" ActionC"不在操作中,则投掷错误

这样的规则集对我来说是一种首选的解决方案,但基于"白名单"的方法也可以很好地适合这种情况。我在这里描述的样本规则也可能更复杂,并且可以在JSON层次结构中的多个级别上进行跨度。

据我告知,JSON Schema验证无法完成所描述的任务,因为它仅验证了JSON文件上的语法是正确的。但是我很乐意承认我的失败,以防万一我错了。

我已经围绕基于Python进行解析机制构建了一个体系结构,最初也希望与Python实施所描述的验证。但是,从第二看,我感觉可能有更好的合适工具来完成此任务。 YACC (与Lex结合使用)等工具,因为整个情况倾向于在JSON-FIELS上定义语法的必要性,该语法是我要执行的我要实现的规则集。但是不幸的是,我对这种工具并不熟悉,因此无法评估,这是否是正确的选择。

所以,重复我的问题。我想知道,哪种工具或编程语言会以"干净"方式很好地适合我的问题?(通过"清洁"一词,我只是指基本上应该针对所需的工具目的,不需要一堆工作来完成。

这是使用JQ的方法。基本想法是将您的检查表示为JQ功能。

例如,如果您的文件 bad.json带有不良文档

{"document":{"Type":"A","Action":["ActionA","ActionB","ActionC"]}}

和一个具有好的文档的文件 good.json

{"document":{"Type":"Good"}}

此命令

jq -Mnr '
   def case1: if (.document.Type == "A") and (.document.Action|contains(["ActionB"])) then "case 1" else empty end;
   def case2: if .document.Type == "B" then "case 2" else empty end;
   def case3: if .document.Type == null then "case 3" else empty end;
   def case4: if (.document.Type == "A") and (.document.Action|contains(["ActionD"])|not) then "case 4" else empty end;
   def status:
       first(case1, case2, case3, case4, "ok")
   ;
     inputs
   | "(input_filename): (status)"
' bad.json good.json

产生

bad.json: case 1
good.json: ok

最新更新