【问题标题】:JSON-Schema pattern repetition inside array数组内的 JSON-Schema 模式重复
【发布时间】:2014-11-14 10:11:25
【问题描述】:

有没有办法为 JSON Schema 文档的数组中的元素创建重复模式。我想用它来验证查询生成器工具生成的查询。

我目前使用的部分架构是

"complexCondition": {
    "anyOf": [
        {
            "title": "Simple condition, e.x. X==0",
            "type": "string"
        },
        {
            "type": "array",
            "items": [
                {
                    "$ref": "#/complexCondition"
                },
                {
                    "type": "string", "enum": ["AND","OR"]
                },
                {
                    "$ref": "#/complexCondition"
                }
            ],
            "additionalItems": false
        }
    ]
}

这允许我正确验证查询“conditionA && conditionB && conditionC”

[[conditionA,"AND",conditionB],"AND",conditionC]

但是,我希望能够验证查询存储为的文档

[conditionA,"AND",conditionB,"AND",conditionC]

这对于任何数量的条件都是可以实现的。

【问题讨论】:

    标签: json validation jsonschema


    【解决方案1】:

    为了实现您打算做的事情,您需要为奇数和偶数位置定义规则 在一个数组中,对于任何长度的数组都不能用 json-schema 完成。

    如果您预期的查询条件数量不会无限增长,您可以硬编码 items 关键字中的前 n 个位置:

    "items":[{"$ref":"#/condition},{"$ref":"#/operator"},{"$ref":"#/condition},{"$ref" :"#/operator"} ...等]

    在这种情况下,您仍然会遇到问题,即您可以定义以“运算符”结尾的错误条件。 其他选项是创建“oneOf”并构建每个可能性(这可以通过脚本自动执行,我猜你不会有包含 100 个子句的表达式......)

    无论如何,我觉得尝试扁平化一个本质上是递归的概念有点奇怪。 你将如何存储这个((A OR B)OR(C AND B))?

    因此,如果您仍然可以重新考虑所需的序列化模式格式,我建议您采用递归方法。比如:

    "predicate" : {
        "type" : "array",
        "items" : {
            "$ref" : "#/clause"
        }
    }
    
    "clause" : {
        "type" : "array",
        "items" : [{
                "$ref" : "#/condition"
            }
        ],
        "additionalItems" : {
            "type" : "array",
            "items" : [{
                    "$ref" : "#/operator"
                }, {
                    "$ref" : "#/clause"
                }
            ]
        }
    }
    

    生成的字符串比较难看,但是用一个简单的递归函数解析它会相当容易:

    简单条件:

    [["condition1"]]
    

    简单从句:

    [["condition1",["OR",["condition2"]]]
    

    在同级添加子句

    [["condition1",["OR",["condition2"]],["OR",["condition3"]]]
    

    将子句添加到子级别

    [["condition1",["OR",["condition2"]],["OR",["condition3", ["AND",["condition4"]]]]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多