2017-06-16 40 views
1

我試圖寫的模式驗證陣列具有以下結構的約束:JSON架構驗證相互依賴陣列結構

  • 它永遠只能包含的值1,2,3,4,5
  • 如果數組包含1,則該數組必須是唯一的條目
  • 該數組只能同時包含2,3或4,例如[2,3]是不允許
  • 5可以是本與2,3,4-

在一起,以便所述有效陣列是

[1], 
[2], 
[3], 
[4], 
[5], 
[2,5], 
[3,5], 
[4,5] 

我開始寫的模式如下:

{ 
    "type": "array", 
    "oneOf": [ 
     { "items": { "enum": [1] } }, 
     { 
      "anyOf": [ 
       ??? 
      ] 
     } 
    ] 
} 

我無法獲得???部分的工作。它有可能嗎? 注:我想避免硬編碼所有可能的數組,因爲我必須驗證更復雜的結構 - 這只是一個示例。此外,最佳解決方案是僅使用anyOf, allOf, oneOf, not,避免使用像minItems

回答

1

這樣的關鍵字,它通過了所有約束條件。

{ 
    "type": "array", 
    "anyOf": [ 
    { "enum": [[1]] }, 
    { 
     "items": { "enum": [2, 3, 4, 5] }, 
     "oneOf": [ 
     { "$ref": "#/definitions/doesnt-contain-2-3-or-4" }, 
     { "$ref": "#/definitions/contains-2" }, 
     { "$ref": "#/definitions/contains-3" }, 
     { "$ref": "#/definitions/contains-4" } 
     ] 
    } 
    ], 
    "definitions": { 
    "doesnt-contain-2-3-or-4": { 
     "items": { "not": { "enum": [2, 3, 4] } } 
    }, 
    "contains-2": { 
     "not": { 
     "items": { "not": { "enum": [2] } } 
     } 
    }, 
    "contains-3": { 
     "not": { 
     "items": { "not": { "enum": [3] } } 
     } 
    }, 
    "contains-4": { 
     "not": { 
     "items": { "not": { "enum": [4] } } 
     } 
    } 
    } 
} 

如果您在使用新的草案-06的關鍵字containsconst的選項,它實際上是一個非常乾淨的解決方案。有一點重複,但我認爲這不會有幫助。

{ 
    "type": "array", 
    "anyOf": [ 
    { "const": [1] }, 
    { 
     "items": { "enum": [2, 3, 4, 5] }, 
     "oneOf": [ 
     { "not": { "contains": { "enum": [2 ,3, 4] } } }, 
     { "contains": { "const": 2 } }, 
     { "contains": { "const": 3 } }, 
     { "contains": { "const": 4 } } 
     ] 
    } 
    ] 
} 
+0

感謝您的回答! [[1]]做了什麼? – tscherg

+0

@tscherg它是一個枚舉,它包含一個單值並且該值爲'[1]'。這是說'1'必須獨立的最簡單的方法。這是可行的,因爲'enum'不限於簡單的類型。 – Jason

+0

我會接受你的答案,再次感謝。我已經快速瀏覽過,並且似乎還沒有針對PHP的v6驗證器。你遇到過嗎? – tscherg