【问题标题】:What programming language or technology to use for defining a rule set on JSON parsing?使用什么编程语言或技术来定义 JSON 解析规则集?
【发布时间】:2017-03-01 13:46:33
【问题描述】:

我正面临以下情况。我目前正在对 JSON 文件编写一个验证机制,以验证是否满足几个约束。 对于这项任务,我想知道哪个可能是最好的工具,我很乐意提供任何合适的建议。

现在你们中的一些人可能想在这里提到,JSON 模式验证器的使用可能是我正在寻找的东西,但我个人认为它与我的用例不匹配。

让我举个例子:

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

对于上面的简化文档,我想定义验证规则,如果不满足它们会产生错误或提示。

规则可以(以抽象的方式)描述如下:

  • 如果文档在 Actions 中具有“A”和“ActionB”类型,则抛出错误
  • 如果文档的类型为“B”,则抛出错误
  • 如果文档没有类型则抛出错误
  • 如果文档的类型为“C”且“ActionC”不在 Actions 中,则抛出错误

这种规则集的“黑名单”方法对我来说是首选解决方案,但基于“白名单”的方法也可以很好地适应这种情况。我在此处描述的示例规则也可能更复杂,并且跨越 JSON 层次结构中的多个级别。

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

我已经围绕基于 python 的解析机制构建了一个体系结构,最初还想用 python 实现所描述的验证。但在第二次看时,我觉得可能有更好的工具来完成这项任务。 我想到了像 Yacc (与 lex 一起使用)这样的工具,因为整个情况倾向于在 JSON 文件上定义一个语法,它执行我想要实现的规则集.但不幸的是,我对这些工具不是很熟悉,因此无法评估它是否是正确的选择。

所以,重复我的问题。我想知道,哪种工具或编程语言能以“干净”的方式很好地解决我的问题?(我所说的“干净”一词只是指该工具基本上应该用于所需的目的,并且不需要一堆变通方法来完成它。因为否则任何工具都适合这个目的)

【问题讨论】:

  • 你个人觉得最适合编码的编程语言,只要它有一个好的 JSON 库(你应该使用它来进行句法解析)。编写自己的 json 解析器来编写语义一致性规则会浪费时间(而且容易出错)。

标签: json validation parsing grammar rules


【解决方案1】:

这是一种使用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

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多