Можно ли ссылаться на набор определений в схеме JSON? - PullRequest
0 голосов
/ 02 мая 2018

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

1 Ответ

0 голосов
/ 02 мая 2018

Вы уже используете definitions. Значение ключа в ключевом слове definitions должно быть схемой JSON. Таким образом, вы можете комбинировать anyOf и $ref аналогично тому, как вы уже сделали.

Ключевые слова "определения" предоставляют стандартизированное местоположение для схемы авторы встроили многократно используемые схемы JSON в более общую схему. Ключевое слово не влияет напрямую на результат проверки.

Значение этого ключевого слова ДОЛЖНО быть объектом. Каждый член значение этого объект ДОЛЖЕН быть допустимой JSON-схемой.

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" на то, что вы хотите назвать. Я предполагаю, что ваши другие определения уже есть, но вы просто не включили их в свой вопрос (что хорошо для этой цели).

...