Можно ли сослаться на набор определений в схеме JSON?

Я строю схему с использованием 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 '/'
        ]
    }
}

Формулируем вам ответ сейчас. Вполне возможно и просто! знак равно

Relequestual 02.05.2018 17:19
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
1
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы уже используете 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 для обсуждения =]

Relequestual 02.05.2018 17:27

Большое спасибо! Это произошло, но я новичок в JSON и JS в целом, поэтому я в основном проводил выборочные проверки с помощью онлайн-валидаторов - к сожалению, последние, похоже, задыхаются, когда есть много циклических ссылок. В настоящее время в процессе создания минимизированного примера для тестирования таких вещей. TBH Я не считаю стандарт очень удобочитаемым, он очень технический. Но отличный сайт космического телескопа очень помогает

Toby 02.05.2018 17:43

Добро пожаловать! Да, это обычная проблема; спецификация разработана с расчетом на разработчиков и пользователей, но если вы не знакомы с чтением документов RFC, ее трудно читать! Сайт космического телескопа отличный, но он не обновляется и не поддерживается, так что будьте осторожны. Мы хотели бы создать несколько хороших руководств, но это отнимает очень много времени! - Я предпочитаю использовать для проверки jsonschemavalidator.net. У меня не было много проблем.

Relequestual 02.05.2018 17:48

Другие вопросы по теме