2017-02-27 64 views
1

我正在嘗試制定一個用於驗證策略語言的模式。簡短:Json schema oneOf with additionalProperties draft-04

策略與斷言關聯。這個斷言既可以是運算符(也可以是),也可以是其他斷言的列表。斷言也可以是原始(葉節點)

我做了一個UML設計,使事情變得更容易理解:

UML diagram

{ 
    "policy": { 
    "name": "test", 
    "expression": { 
     "operator": "all", 
     "value": [ 
     { 
      "primitive": "encrypt", 
      "preference": 12345, 
      "usage": "required" 
     }, 
     { 
      "primitive": "sign", 
      "preference": 12345, 
      "usage": "required" 
     } 
     ], 
     "preference": 12345, 
     "usage": "required" 
    } 
    } 
} 

這裏是我currenty做出的方案:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "minProperties": 1, 
    "additionalProperties": { 
    "$ref": "#/definitions/policy" 
    }, 
    "definitions": { 
    "policy": { 
     "title": "Policy", 
     "type": "object", 
     "required": [ 
     "name", 
     "expression" 
     ], 
     "additionalProperties": false, 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "expression": { 
      "$ref": "#/definitions/assertion" 
     } 
     } 
    }, 
    "operator": { 
     "properties": { 
     "value": { 
      "type": "array", 
      "items": { 
      "$ref": "#/definitions/assertion" 
      } 
     }, 
     "operator": { 
      "enum": [ 
      "allOne", 
      "all" 
      ] 
     } 
     } 
    }, 
    "primitive": { 
     "properties": { 
     "primitive": { 
      "enum": [ 
      "encrypt", 
      "sign" 
      ] 
     } 
     } 
    }, 
    "assertion": { 
     "type": "object", 
     "additionalProperties": false, 
     "oneOf": [ 
     { 
      "$ref": "#/definitions/operator" 
     }, 
     { 
      "$ref": "#/definitions/primitive" 
     } 
     ], 
     "properties": { 
     "preference": { 
      "type": "integer", 
      "minimum": 0, 
      "exclusiveMinimum": true 
     }, 
     "usage": { 
      "enum": [ 
      "required", 
      "rejected", 
      "optional", 
      "observed", 
      "ignored" 
      ] 
     } 
     } 
    } 
    } 
} 

通過使用"oneOf"我的試圖使用操作符或原語的規範。但我不知道這是去,因爲我收到以下錯誤方式:

"message" : "object instance has properties which are not allowed by the schema: [\"operator\",\"value\"]"

錯誤消息抱怨它沒有被定義(因爲"additionalProperties": false)額外的屬性。但是,這些定義在定義中...

+0

看到這一點:https://github.com/epoberezkin/ajv/blob/master/FAQ.md#additional-properties-inside-compound-keywords-anyof-oneof-等 和這個:https://github.com/epoberezkin/ajv/issues/134#issuecomment-242989744 – esp

+0

好吧,明白了!感謝您的信息。 – freskimo

回答

0

oneOf,anyOf ......關鍵字不能用於引用其他定義。他們的工作爲required。解決方案是聲明所有屬性並只需要上下文中所需的屬性。我的例子將成爲以下:

"assertion": { 
    "type": "object", 
    "additionalProperties": false, 
    "oneOf": [ 
    { 
     "required": [ 
     "operator" 
     ] 
    }, 
    { 
     "required": [ 
     "primitive" 
     ] 
    } 
    ], 
    "properties": { 
    "operator": { 
     "$ref": "#/definitions/operator" 
    }, 
    "primitive": { 
     "$ref": "#/definitions/primitive" 
    }, 
    "preference": { 
     "type": "integer", 
     "minimum": 0, 
     "exclusiveMinimum": true 
    }, 
    "usage": { 
     "enum": [ 
     "required", 
     "rejected", 
     "optional", 
     "observed", 
     "ignored" 
     ] 
    } 
    } 
}