2017-07-13 56 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