避免JSON模式定义中的循环依赖

时间:2017-07-13 16:31:33

标签: json jsonschema

如何定义两个相互引用的字段而不会导致循环依赖。

在以下示例中,我希望min_percentage的最大值为max_percentage的最小值,max_percentage的最小值为min_percentage的最大值;

所以

"min_percentage": {

    "type": "integer",
    "minimum" : 1,
    "maximum" : 99
}

"max_percentage": {

    "type": "integer",
    "minimum" : 2,
    "maximum" : 150
}

变得类似

"min_percentage": {

    "type": "integer",
    "minimum" : 1,
    "maximum" : "#max_percentage#minimum"
}

"max_percentage": {

    "type": "integer",
    "minimum" : "#min_percentage#maximum",
    "maximum" : 150
}
编辑:我想到了一个可能的解决方案......

使用Schema Dependencies可以实现这一点 https://spacetelescope.github.io/understanding-json-schema/reference/object.html?highlight=default

我们只指定max_percentage,并使min_percentage成为依赖项,然后#min_percentage#maximum可以基于#max_percentage#minimum删除任何循环依赖项。

    "max_percentage": {

        "type": "integer",
        "minimum" : 2,
        "maximum" : 150
    }

    "dependencies": {

        "max_percentage": {

            "properties": {

                "min_percentage": {

                    "type": "integer",
                    "minimum" : 1,
                    "maximum" : "#max_percentage#minimum"
                }
            },
            "required": ["min_percentage"]
        }
    }

但这显然不能完成.. Can JSON integer attributes be referenced?

感谢。

1 个答案:

答案 0 :(得分:1)

在非循环图表中,您始终可以找到Topological sorting。同样重要的是,这也是另一种方式。这可以通过将每个引用视为有向图中的有向边来应用,其中每个节点都是文档中的某个变量。

告诉我们的是,应该可以以我们只需要引用的方式列出所有值,如果我们的依赖是非循环的,则永远不要引用文档中下面列出的元素。这当然是有代价的,因为不能保证这样的列表仍然能够遵循相同的分组。但是这里有一种可能的格式,具有上述列表格式:

"min_max_percentage": 30
"min_percentage": {

    "type": "integer",
    "minimum" : 1,
    "maximum" : "#min_max_percentage"
}

"max_percentage": {

    "type": "integer",
    "minimum" : "#min_max_percentage",
    "maximum" : 150
}

通过拓扑排序可以保证,通过引入额外的代理变量,您将始终能够找到这样的表示。例如min_max_percentage,只要您的依赖图是非循环的。而且,相反,如果您的格式规范只允许反向引用,那么永远不会有循环依赖。