1
我正在嘗試制定一個用於驗證策略語言的模式。簡短:Json schema oneOf with additionalProperties draft-04
策略與斷言關聯。這個斷言既可以是運算符(也可以是),也可以是其他斷言的列表。斷言也可以是原始(葉節點)。
我做了一個UML設計,使事情變得更容易理解:
{
"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
)額外的屬性。但是,這些定義在定義中...
看到這一點: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
好吧,明白了!感謝您的信息。 – freskimo