2017-08-17 62 views
3

我正在驗證一個json方案,我需要檢查json是否有一個'activities'數組,如果沒有,如果它有一個'live'屬性是真實的。測試anyOf在json架構中的值必須爲真

我的模式是很簡單note the enum is not working

const viewSchema = { 
    "type": "object", 
    "anyOf": [ 
     {"required": ["live"]}, 
     {"required": ["activities"]} 
    ], 
    "properties":{ 
     "title": {"type": "string"}, 
     "live": {"type": "boolean", "enum": [ true ]}, 
     "activities": {"type": "array"} 

    } 

所以我試圖驗證對以下

isValid({title: 'a title'}) // false: activities or live required 
isValid({title: 'a title', activities: []}) // true 
isValid({title: 'a title', live: true}) // true 
isValid({title: 'a title', live: false) // true - this should be false 
+1

你的模式是正確的。如果你得到錯誤的結果,這可能是驗證器中的一個錯誤。 – Jason

+0

用http://www.jsonschemavalidator.net上的驗證器對您的模式進行測試。 對於此json {title:'a title'在枚舉中。 所以,你的模式是好的。 – pan

回答

1

這是一個有點多餘,但你可以使用oneOf和兩種不同的模式來實現這一目標。

下面是一個例子使用AJV:

// Code goes here 
 

 
var ajv = new Ajv({ 
 
    $data: true, 
 
    verbose: true 
 
}); 
 

 
let schema = { 
 
    "type": "object", 
 
    "oneOf": [{ 
 
     "type": "object", 
 
     "properties": { 
 
     "live": { 
 
      "type": "boolean", 
 
      "enum": [true] 
 
     }, 
 
     }, 
 
     "required": ["live"] 
 
    }, 
 
    { 
 
     "type": "object", 
 
     "properties": { 
 
     "activities": { 
 
      "type": "array" 
 
     } 
 
     }, 
 
     "required": ["activities"] 
 
    } 
 
    ] 
 
}; 
 

 

 
ajv.validate(schema, { 
 
    title: 'a title' 
 
}) // false: activities or live required 
 
console.log('ERRORS: ', this.ajv.errors) 
 
ajv.validate(schema, { 
 
    title: 'a title', 
 
    activities: [] 
 
}) // true 
 
console.log('ERRORS: ', this.ajv.errors) 
 
ajv.validate(schema, { 
 
    title: 'a title', 
 
    live: true 
 
}) // true 
 
console.log('ERRORS: ', this.ajv.errors) 
 
ajv.validate(schema, { 
 
    title: 'a title', 
 
    live: false 
 
}) // this is now invalid 
 
console.log('ERRORS: ', this.ajv.errors)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/5.3.0/ajv.bundle.js"></script>