首页 文章

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

提问于
浏览
0

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

在下面的例子中,我希望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 回答

  • 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
    }
    

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

相关问题