Json схема одна с дополнительными свойствами 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"
}
}
}
И вот схема, которую я сделал в настоящее время:
{
"$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": "Экземпляр объекта имеет свойства, которые не разрешены схемой: [\"operator\",\"value\"]"
Сообщение об ошибке жалуется на дополнительные свойства, которые не определены (из-за "additionalProperties": false
). Тем не менее, они определены в определениях...
1 ответ
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"
]
}
}
}