2017-02-02 154 views
0

我不知道這是可能的JSON模式,但我也有類似的對這些數據的數字/布爾值的嵌套列表:我如何可以驗證驗證使用JSON模式

[1, 1, [0, 0, [true]], true] 

[0,0, 1],這樣至少有一個項目是真實的?

到目前爲止,我已成功地創建模式這一點:

{ 
 
    "type": "array", 
 
    "items": { 
 
    "$ref": "#/definitions/_items" 
 
    }, 
 
    "definitions": { 
 
    "_items": { 
 
     "anyOf": [ 
 
     { 
 
      "enum": [ 
 
      0, 
 
      1 
 
      ], 
 
      "type": "integer" 
 
     }, 
 
     { 
 
      "enum": [ 
 
      false, 
 
      true 
 
      ], 
 
      "type": "boolean" 
 
     }, 
 
     { 
 
      "type": "array", 
 
      "items": { 
 
      "anyOf": [ 
 
       { 
 
       "$ref": "#/definitions/_items" 
 
       } 
 
      ] 
 
      } 
 
     } 
 
     ] 
 
    } 
 
    } 
 
}

顯然它並驗證所有的接受值,但它沒有考慮是考慮,如果有所有,一些,一個或者沒有值1 /真。我誤解了,anyOf,allOf和oneOf都是爲此保留的...

回答

2

你需要的是一個contains關鍵字。這是計劃在JSON模式規範的下一個版本中添加的。在此之前,您可以在沒有contains的情況下執行此操作,但邏輯有點複雜。我還清理了迄今爲止所有不必要的部分。

{ 
    "type": "array", 
    "items": { "$ref": "#/definitions/_items" }, 
    "allOf": [{ "$ref": "#/definitions/contains-1-or-true" }], 
    "definitions": { 
    "_items": { 
     "anyOf": [ 
     { "enum": [0, 1] }, 
     { "type": "boolean" }, 
     { "$ref": "#" } 
     ] 
    }, 
    "contains-1-or-true": { 
     "not": { 
     "type": "array", 
     "items": { 
      "not": { "enum": [1, true] } 
     } 
     } 
    } 
    } 
} 
+0

我結束了非常類似的解決方案,使用不是notation。你能解釋爲什麼在這裏需要anyOf ref#嗎?這對於深度嵌套結構是否真的可以遞歸地工作? – MarkokraM

+0

是的,這將適用於任何級別的嵌套。 '{「$ ref」:「#」}'指的是整個模式。這是一個遞歸引用。或者,您可以通過複製前三行(類似於您所做的)來完成。但是,遞歸引用是一個更清晰的解決方案,因爲它消除了重複。 – Jason

+0

我打開了與此相關的其他問題,你@Jason可能可以給出答案:http://stackoverflow.com/questions/42026162/xor-logic-in-json-schema-for-list-of-布爾項 – MarkokraM