Я строю схему с использованием JSON-схемы, часть которой описывает математические операции (такие как сложение, умножение, вычитание, деление и т. д.).
Эти операции могут принимать операнды, которые являются переменными, но они также могут принимать экземпляры самих себя. То есть типы "add"
и "multiply"
могут быть представлены следующим образом:
"add": {
"description": "The mathematical operation of adding two or more operands together",
"type": "array",
"minItems": 2,
"items": {
"anyOf": [
{ "$ref": "#/definitions/variable" },
{ "$ref": "#/definitions/subformula" },
{ "$ref": "#/definitions/add" },
{ "$ref": "#/definitions/multiply" },
{ "$ref": "#/definitions/subtract" },
{ "$ref": "#/definitions/divide" },
{ "$ref": "#/definitions/sum" },
{ "$ref": "#/definitions/maximum" },
{ "$ref": "#/definitions/average" }
]
}
},
"multiply": {
"description": "The mathematical operation of multiplying two or more operands together",
"type": "array",
"minItems": 2,
"items": {
"anyOf": [
{ "$ref": "#/definitions/variable" },
{ "$ref": "#/definitions/subformula" },
{ "$ref": "#/definitions/add" },
{ "$ref": "#/definitions/multiply" },
{ "$ref": "#/definitions/subtract" },
{ "$ref": "#/definitions/divide" },
{ "$ref": "#/definitions/sum" },
{ "$ref": "#/definitions/maximum" },
{ "$ref": "#/definitions/average" }
]
}
}
Для JSON, например:
"add": [ 5, 6, "multiply": [ 2, 3 ] ]
Этот список ссылок на типы аналогичен для каждой операции и подформулы. Это довольно громоздко в случае, если могут быть добавлены дополнительные операции, их нужно добавлять в этот список в каждом месте, где он встречается ...
Можно ли как-то разметить операции так, чтобы я мог называть их группой, примерно так:
"add": {
"description": "The mathematical operation of adding two or more operands together",
"type": "array",
"minItems": 2,
"items": {
"anyOf": [
{ "$ref": "#/definitions/variable" },
{ "$ref": "#/definitions/subformula" },
{ "$ref": "#/definitions/operations/" } //note the trailing '/'
]
}
},
"multiply": {
"description": "The mathematical operation of multiplying two or more operands together",
"type": "array",
"minItems": 2,
"items": {
"anyOf": [
{ "$ref": "#/definitions/variable" },
{ "$ref": "#/definitions/subformula" },
{ "$ref": "#/definitions/operations/" } //note the trailing '/'
]
}
}
Вы уже используете definitions
. Значение ключа в ключевом слове definitions
должно быть схемой JSON. Таким образом, вы можете комбинировать anyOf
и $ref
аналогично тому, как вы это уже сделали.
The "definitions" keywords provides a standardized location for schema authors to inline re-usable JSON Schemas into a more general schema. The keyword does not directly affect the validation result.
This keyword's value MUST be an object. Each member value of this object MUST be a valid JSON Schema.
https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9
"items": {
"$ref": "#/definitions/myOtherGroup",
}
...
"definitions": {
"operations": {
"anyOf": [
{ "$ref": "#/definitions/add" },
{ "$ref": "#/definitions/multiply" },
{ "$ref": "#/definitions/subtract" },
{ "$ref": "#/definitions/divide" },
{ "$ref": "#/definitions/sum" },
{ "$ref": "#/definitions/maximum" },
{ "$ref": "#/definitions/average" }
]
}
"myOtherGroup": {
"anyOf": [
{ "$ref": "#/definitions/variable" },
{ "$ref": "#/definitions/subformula" },
{ "$ref": "#/definitions/operations" },
]
}
}
Вам просто нужно изменить имя «myOtherGroup» на то, что вы хотите называть. Я предполагаю, что другие ваши определения уже есть, но вы просто не включили их в свой вопрос (что подходит для этой цели).
Любопытно узнать, если это просто не пришло вам в голову, или что-то отсутствует в спецификации, мы можем добавить, чтобы прояснить это. Не стесняйтесь присоединиться к JSON Schema Slack для обсуждения =]
Большое спасибо! Это произошло, но я новичок в JSON и JS в целом, поэтому я в основном проводил выборочные проверки с помощью онлайн-валидаторов - к сожалению, последние, похоже, задыхаются, когда есть много циклических ссылок. В настоящее время в процессе создания минимизированного примера для тестирования таких вещей. TBH Я не считаю стандарт очень удобочитаемым, он очень технический. Но отличный сайт космического телескопа очень помогает
Добро пожаловать! Да, это обычная проблема; спецификация разработана с расчетом на разработчиков и пользователей, но если вы не знакомы с чтением документов RFC, ее трудно читать! Сайт космического телескопа отличный, но он не обновляется и не поддерживается, так что будьте осторожны. Мы хотели бы создать несколько хороших руководств, но это отнимает очень много времени! - Я предпочитаю использовать для проверки jsonschemavalidator.net. У меня не было много проблем.
Формулируем вам ответ сейчас. Вполне возможно и просто! знак равно