如何定义两个相互引用的字段而不会导致循环依赖。
在以下示例中,我希望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?
感谢。
答案 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
,只要您的依赖图是非循环的。而且,相反,如果您的格式规范只允许反向引用,那么永远不会有循环依赖。