2017-07-13 39 views
0

如何定义两个彼此相互引用而不引起循环依赖的字段?避免JSON模式定义中的循环依赖

在以下示例中,我希望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 
} 

编辑:我想到了一个可能的解决方案..

这可以通过使用模式的依赖有可能 https://spacetelescope.github.io/understanding-json-schema/reference/object.html?highlight=default

我们只指定max_per centage,并使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

在非循环图中,您始终可以找到一个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只要找到这样的表现你依赖图是非循环的。而相反,如果你的格式规范只允许反向引用,那么永远不会有循环依赖。

+0

但是,这不会将min_percentage#maximum和max_percentage#minimum限制为min_max_percentage吗?如果是这样,我不想这样做,因为这些可以改变。 如果这是代码,我们可以让min_max_percentage采用第一个项目集的值,即如果max_percentage#minimum是先设置的,那么这将是它的新值,并反映在min_percentage#maximum的设置上。诀窍是在验证JSON的过程中让模式执行此操作,有什么想法? – Dodomac

+0

虽然JSON不是代码,但它的意思是__efficient__对象__notation__。如果你想要表达一个完全成熟的关系模型,那么在这个评论之后,你最好使用像XML这样的更好的支持,这个支持我认为你想实现的东西。值得注意的是,它具有'DOM'(文档对象模型)以及引用,并且也可以执行'Schema验证'。 – HeroicKatora