Как расширить объект с 1 параметром в json-схеме - PullRequest
0 голосов
/ 12 октября 2019

Раньше я писал одну схему JSON, но теперь, когда я пытаюсь сделать ее немного более продвинутой, я застрял.

(я открыт для советов по «хорошей практике» в комментариях)

(Является ли $id необязательным? Я должен удалить его для простоты в примере кода?)

Цель:

Я пытаюсь создать схему с определением объекта (example_obj), которое используется рекурсивно. Этот объект может иметь только 1 аргумент (or или and или value). Но в корне json я хочу добавить 1 дополнительное свойство.

json-schema

{
  "definitions": {
    "example_obj": {
      "$id": "#/definitions/example_obj",
      "type": "object",
      "maxProperties": 1,
      "properties": {
        "or": {
          "$id": "#/definitions/example_obj/properties/or",
          "type": "array",
          "items": {
            "$id": "#/definitions/example_obj/properties/or/items",
            "$ref": "#/definitions/example_obj"
          }
        },
        "and": {
          "$id": "#/definitions/example_obj/properties/and",
          "type": "array",
          "items": {
            "$id": "#/definitions/example_obj/properties/and/items",
            "$ref": "#/definitions/example_obj"
          }
        },
        "value": {
          "$id": "#/definitions/example_obj/properties/value",
          "type": "string"
        }
      }
    }
  },
  "type": "object",
  "title": "The Root Schema",
  "required": ["filter_version"],
  "allOf": [
    {
      "$ref": "#/definitions/example_obj"
    },
    {
      "properties": {
        "filter_version": {
          "$id": "#/properties/filter_version",
          "type": "string",
          "pattern": "^([0-9]+\\.[0-9]+)$"
        }
      }
    }
  ]
}

json, которое я хочу пройти:

{
  "filter_version": "1.0",
  "or": [
    {
      "and": [
        {
          "value": "subject"
        }
      ]
    },
    {
      "or": [
        {
          "value": "another subject"
        }
      ]
    }
  ]
}

Проблема:

Когда я пытаюсь расширить example_obj для определения корня, оно кажется неудачным, потому что объект example_obj не допускает более 1 свойства по дизайну.

Другими словамиПохоже, что каждая проверка номера аргумента, который я добавляю к example_obj, также выполняется для дополнительного свойства (т. е. filter_version).

Кто-нибудь знает, где разместить эту проверку для «точно 1аргумент ', чтобы он не оценивался на объекте root?

Попытки:

Я пытался работать с различными способами определения требований example_obj, но безуспешно. Как и при замене "maxProperties": 1 на:

"oneOf": [
  {
    "required": [
      "or"
    ]
  },
  {
    "required": [
      "and"
    ]
  },
  {
    "required": [
      "where"
    ]
  },
  {
    "required": [
      "where not"
    ]
  }
],

Заранее благодарен за любую помощь !!

Проверка моей схемы с помощью онлайн-валидатора схемы .

(В конце мне нужно проверить его на Python, на случай, если это имеет значение)

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете использовать oneOf вместо maxProperties, чтобы обойти это.

{
  "type": "object",
  "properties": {
    "filter_version": {
      "type": "string",
      "pattern": "^([0-9]+\\.[0-9]+)$"
    }
  },
  "required": ["filter_version"],
  "allOf": [{ "$ref": "#/definitions/example_obj" }],
  "definitions": {
    "example_obj": {
      "type": "object",
      "properties": {
        "or": { "$ref": "#/definitions/example-obj-array" },
        "and": { "$ref": "#/definitions/example-obj-array" },
        "value": { "type": "string" }
      },
      "oneOf": [
        { "required": ["or"] },
        { "required": ["and"] },
        { "required": ["value"] }
      ]
    },
    "example-obj-array": {
      "type": "array",
      "items": { "$ref": "#/definitions/example_obj" }
    }
  }
}

PS Вы используете $id неправильно. Я знаю, что есть инструмент, который генерирует подобные схемы и вызывает эту путаницу. Способ $id используется здесь - нет. Это не больно, но не делает ничего, кроме вздутия вашей схемы.

...