2012-01-27 141 views
30

想知道模式草案03是否可以實現這一點。我已經獲得了其他地方的依賴關係,我想可能只是爲了使用它們而需要創造性地使用它們他們用於指定某個字段的required屬性。JSON模式 - 根據另一個字段的值,指定字段是必需的

我目前的最佳嘗試(不起作用)應該會給你一些關於我之後的想法。我想要一個默認值,當另一個字段有特定值時是可選的。

{ 
    "description" : "An address...", 
    "type" : "object", 
    "properties" : { 
     "postcode": { 
      "type" : "string", 
      // postcode should be required by default 
      "required" : true,  
      // postcode shouldn't be required if the country is new zealand 
      "dependencies" : { 
       "country" : { 
        "enum" : ["NZ", "NZL", "NEW ZEALAND"] 
       }, 
       "postcode" : { 
        "required" : false  
       } 
      } 
     }, 
     "country": { 
      "type" : "string", 
      "enum" : [ 
       // various country codes and names... 
      ], 
      "default" : "AUS" 
     } 
    } 
} 

回答

25

這對草案版本3來說絕對可行。既然你有允許國家的完整列表,那麼你可以做這樣的事情:

{ 
    "type": [ 
     { 
      "title": "New Zealand (no postcode)", 
      "type": "object", 
      "properties": { 
       "country": {"enum": ["NZ", "NZL", "NEW ZEALAND"]} 
      } 
     }, 
     { 
      "title": "Other countries (require postcode)", 
      "type": "object", 
      "properties": { 
       "country": {"enum": [<all the other countries>]}, 
       "postcode": {"required": true} 
      } 
     } 
    ], 
    "properties": { 
     "country": { 
      "type" : "string", 
      "default" : "AUS" 
     }, 
     "postcode": { 
      "type" : "string" 
     } 
    } 
} 

所以你實際上定義了兩個子類型的模式,一個爲需要郵政編碼的國家,一個國家的不要。

編輯 - v4等價物非常相似。只需將頂級"type"陣列重命名爲"oneOf"即可。

+5

值得注意的是,在版本4中,將模式放在'type'關鍵字中將被禁止。你可能會想要使用'allOf'或'oneOf'。 – cloudfeet 2012-10-18 15:38:01

+0

在規範的第4版中呢? – Relequestual 2014-10-06 12:57:11

+1

我會添加一些答案,以澄清v4替代品 – cloudfeet 2014-10-06 13:30:40

2

我只是看了03版本的規範,我不認爲你所描述的是可能的。這絕對不是「簡單依賴」,而「Schema Dependency」的描述沒有提及任何方式來考慮屬性的

這聽起來像你需要的是「條件模式依賴」。

還有什麼是可能用簡單的一些討論和架構的依賴關係在這裏: http://groups.google.com/group/json-schema/msg/8145690ebb93963b

你可能會問該組是否有計劃支持有條件的依賴關係。

+0

輝煌,感謝您的鏈接。看起來JSON Schema目前還處於初級階段,發現任何類型的文檔都很難! ><我認爲真正需要的是依賴性來操縱它們在其中定義的模式的原始屬性的方式 - 這將允許通過依賴性以及許多其他可能的技巧來覆蓋默認值和需求。 – pospi 2012-02-03 00:41:08

+0

答案中提供的鏈接包含一個非常有價值的實踐例子!對於規範的每個部分都沒有更好的文檔/更實用的示例,這是一種恥辱。 – Relequestual 2014-10-07 08:51:13

10

如果有人正在爲草案4的解決方案,你可以用enum關鍵字一起使用dependencies關鍵字:

{ 
    "type": "object", 
    "properties": { 
     "play": { 
      "type": "boolean" 
     }, 
     "play-options": { 
      "type": "string" 
     } 
    }, 
    "dependencies": { 
     "play-options": { 
      "properties": { 
       "play": { 
        "enum": [true] 
       } 
      } 
     } 
    } 
} 

這樣play-options總是需要play值爲true

+0

是的,它的工作原理。謝謝。如果你告訴方法使''''''''''''''''''''''「''''''也就是說,如果條件滿足,則需要玩選項。 – Nilesh 2017-01-25 05:27:26

+0

@Nilesh對不起,你想實現什麼? – ppalacios 2017-01-26 14:01:11

+3

我不認爲這回答了這個問題。答案中的依存意味着存在「play-options」時,「play」必須爲「true」。但是當「play」是「true」時,「play-options」不必存在。 – Sisyphus 2017-10-21 13:35:44

0

嘗試使用依賴與 'ID':

{ 
    "title": "Test dependncies", 
    "readOnly": false, 
    "$schema": "http://json-schema.org/draft-04/hyper-schema", 
    "description": "This a test to show how we can use dependencies in json schema", 
    "properties":{ 
     "graduate": { 
      "title":"Graduate?", 
      "type":"string", 
      "enum":["Yes","No"], 
      "options": { 
      "dependencies":[ 
       {"id":"minimumEligibilityAge","value":"Yes"}, 
       {"id":"courseName","value":"No"} 
       ] 
      } 
     }, 
     "minimumEligibilityAge":{ 
      "id":"minimumEligibilityAge", 
      "title":"Enter Age", 
      "type":"number", 
      "options":{"hide_display":true} 
      }, 
     "courseName":{ 
      "id":"courseName", 
      "title":"Enter Graduation Course Name", 
      "type":"string" 
     } 
    }, 
    "type": "object" 
} 

如果研究生的價值是肯定的,它需要minimumEligibilityAge。 如果畢業生的價值是否,它需要courseName

相關問題