2017-06-23 52 views
1

需要一個特定的項目,我有以下json對象:陣列中的

{ 
    "my_items": [ 
    { "a": "primary", n: 1 }, 
    { "b": "secondary", n: 2 }, 
    { "b": "secondary", n: 3 } 
    ] 
} 

my_items列表中的所有項目都應該是唯一的。現在,我需要用下面的規則來驗證整個json對象:

它可能包含與"type": "secondary"零個或多個項目,但它絕對必須包含一個且只有一個"type": "primary"項目。

這怎麼可以用最新的json-schema表示?

我拿出following

var schema = { 
    "definitions": { 
    "primary_item": { 
     "type": "object", 
     "properties": { 
     "a": { 
      "type":"string", 
      "enum":["primary"] 
     } 
     } 
    }, 
    "secondary_item": { 
     "type": "object", 
     "properties": { 
     "b": { 
      "type": "string", 
      "enum":["secondary"] 
     } 
     } 
    } 
    }, 
    "type": "object", 
    "properties": { 
    "my_items": { 
     "type": "array", 
     "minItems": 1, 
     "contains": {"$ref": "#/definitions/primary_item"}, 
     "items": { 
     "anyOf": [ 
      {"$ref": "#/definitions/primary_item"}, 
      {"$ref": "#/definitions/secondary_item"} 
     ], 
     "additionalProperties": false 
     } 
    } 
    }, 
    "additionalProperties": false 
}; 

var validate = ajv.compile(schema); 

test({ 
    "my_items": [ 
    {"a": "primary"}, 
    {"b": "secondary"}, 
    {"b": "secondary"} 
    ] 
}); 

但測試失敗,與以下錯誤:

Invalid: data.my_items[0] should NOT have additional properties, data.my_items[1] should NOT have additional properties, data.my_items[2] should NOT have additional properties 

回答

0

有一個在JSON模式沒有辦法斷言數組包含一件東西。你可以斷言至少有一個,但這是你能做的最好的。您可以得到的最接近的要求是primary_item是數組中的第一個元素。

{ 
    "type": "object", 
    "properties": { 
    "my_items": { 
     "type": "array", 
     "items": [ 
     {"$ref": "#/definitions/primary_item"} 
     ], 
     "additionalItems": {"$ref": "#/definitions/secondary_item"} 
    } 
    }, 
    "additionalProperties": false, 
    "definitions": { 
    "primary_item": { 
     "type": "object", 
     "properties": { 
     "a": { "enum":["primary"] } 
     }, 
     "additionalProperties": false 
    }, 
    "secondary_item": { 
     "type": "object", 
     "properties": { 
     "b": { "enum":["secondary"] } 
     }, 
     "additionalProperties": false 
    } 
    } 
} 

編輯

迴應評論

不知一個且只有一個可以用兩個概念來表示:at least one + unique

是的。如果您的數組項目是唯一的,您可以執行以下操作。

{ 
    "type": "object", 
    "properties": { 
    "my_items": { 
     "type": "array", 
     "items": { "$ref": "#/definitions/my_item" }, 
     "allOf": [{"$ref": "#/definitions/contains_primary_item"}], 
     "uniqueItems": true 
    } 
    }, 
    "additionalProperties": false, 
    "definitions": { 
    "my_item": { 
     "type": "object", 
     "properties": { 
     "a": { "type": "string" } 
     }, 
     "additionalProperties": false 
    }, 
    "primary_item": { 
     "type": "object", 
     "properties": { 
     "a": { "enum":["primary"] } 
     }, 
     "additionalProperties": false 
    }, 
    "contains_primary_item": { 
     "not": { 
     "items": { 
      "not": { "$ref": "#/definitions/primary_item" } 
     } 
     } 
    } 
    } 
} 
+0

我不知道**是否只有一個**可以用兩個概念來表示:'至少有一個'+'唯一'。你怎麼看? 我覺得列表中的所有對象都是唯一的(而我的例子意味着我可能有重複,這是不正確的;我已經更新了這個問題)。 – gmile