2017-10-09 88 views
1

我需要驗證一個JSON對象總是有2個屬性:jsonschema驗證條件必需的

  • 類型
  • 名稱

類型可以是 「A」, 「B」或「C」,

當類型爲「A」時,還需要屬性「foo」並且不允許其他屬性。

OK:

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
} 

不正常:

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
    "lol": "a" 
} 

當類型是 「B」,該屬性 「欄」 是必需的,沒有額外的性能是允許的。

當類型爲「C」時,屬性「bar」是必需的,並且可選地還可以存在「zen」屬性。

OK:

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
    "zen": "a" 
} 

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
} 

不正常:

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
    "lol": "a" 
} 

不幸的是,優秀的答案,這question部分覆蓋我的情況,但是我沒有設法建立,對我工作的jsonschema。

編輯:

這裏是我試過了。

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "object", 
    "properties": { 
     "type": { 
      "type": "string", 
      "enum": ["A", "B", "C"] 
     }, 
     "name": {"type": "string"}, 
     "foo": {"type": "string"}, 
     "bar": {"type": "string"}, 
     "zen": {"type": "string"}, 
    }, 
    "anyOf": [ 
     { 
      "properties": {"type": {"enum": ["A"]}}, 
      "required": ["foo"], 
     }, 
     { 
      "properties": {"type": {"enum": ["B"]}}, 
      "required": ["bar"], 
     }, 
     { 
      "properties": {"type": {"enum": ["C"]}}, 
      "required": ["bar"], 
     }, 
    ] 
} 

我的問題是,設置字段「additionalProperties」的對象裏面假的「anyOf」不給我預期的結果。

例如以下JSON通過驗證,儘管它具有附加屬性「笑」

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
    "lol": "a" 
} 
+0

我更新了我的文章,包括我試過的例子以及爲什麼這個解決方案不適用於我的原因 – cunfusu

回答

0

JSON架構是一種約束系統,其中每個子模式的約束分別進行評價。這意味着「additionalProperties」只能在相同的即時模式對象中「查看」「屬性」或「patternProperties」。

此外,它不能根據「required」僅在「properties」和「patternProperties」上「查看」屬性。

據我所知,如果你設置「additionalProperties」:假設在裏面,每個分支的anyOf,這些都不應該作爲唯一允許的屬性是「type」。如果你這樣做,它允許「type」以外的屬性,那麼我想知道你使用的是什麼實現。

+0

所以基本上實現我需要的剛性模式的唯一方法是使用anyOf和驗證到底是什麼的模式列表我需要,我想重用一些屬性,但似乎這是不可能的。 – cunfusu

+0

在草稿-04中,是的,這是正確的。 –

+0

在draft-06中,您可以使用'propertyNames'做一些重用,雖然它不是非常簡潔。 –