Использование нескольких anyOf внутри oneOf - PullRequest
0 голосов
/ 18 октября 2018

Я хотел создать схему, в которой у меня будет несколько объектов внутри "oneOf", в которых будет много объектов в формате anyOf, где некоторые ключи могут быть требуемого типа (эта часть работает) Моя схема: -

{
    "description": "schema v6",
    "type": "object",
    "oneOf": [
    {
    "properties": {
    "Speed": {
      "items": {
        "anyOf": [
          {
            "$ref": "#/definitions/speed"
          },
          {
            "$ref": "#/definitions/SituationType"
          }
        ]
      },
      "required": [
        "speed"
      ]
    }
  },
  "additionalProperties": false
        }
      ],
      "definitions": {
        "speed": {
          "description": "Speed",
          "type": "integer"
        },
        "SituationType": {
          "type": "string",
          "description": "Situation Type",
          "enum": [
            "Advice",
            "Depend"
              ]
            }
          }
        }

Но когда я пытаюсь проверить эту схему, но я могу аутентифицировать некоторые неправильные значения, такие как

    {
      "Speed": {
        "speed": "ABC",//required
        "SituationType1": "Advisory1" //optional but key needs to be correct
      }
    }

правильный ответ, который я ожидал, был

    {
      "Speed": {
        "speed": "1",
        "SituationType": "Advise" 
      }
    }

1 Ответ

0 голосов
/ 18 октября 2018

Во-первых, вам нужно правильно установить тип схемы, в противном случае имплементации могут предполагать, что вы используете последнюю версию схемы JSON (в настоящее время черновик-7).

Итак, в корне схемы вам понадобитсяследующее:

"$schema": "http://json-schema.org/draft-06/schema#",

Во-вторых, items применимо, только если целью является массив.В настоящее время ваша схема проверяет только следующее:

Если корневой объект имеет свойство «Скорость», он должен иметь ключ «скорость».Корневой объект не должен иметь никаких других свойств.

И ничего больше.

Вы используете definitions и то, как вы ссылаетесь на них, вероятно, не то, что вы намеревались.

Похоже, вы хотите, чтобы Speed содержал speed, который должен быть целым числом, и, необязательно, SituationType, который должен быть строкой, ограниченной перечислением, и ничем иным.

Вот схемаЯ основывался на том, что правильно и успешно проходит, основываясь на данных вашего примера:

{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "oneOf": [
    {
      "properties": {
        "Speed": {
          "properties":{
            "speed": {
              "$ref": "#/definitions/speed"
            },
            "SituationType": {
              "$ref": "#/definitions/SituationType"
            }
          },
          "required": [
            "speed"
          ],
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    }
  ],
  "definitions": {
    "speed": {
      "description": "Speed",
      "type": "integer"
    },
    "SituationType": {
      "type": "string",
      "description": "Situation Type",
      "enum": [
        "Advice",
        "Depend"
      ]
    }
  }
}

Вам необходимо определить свойства для Speed, потому что в противном случае вы не можете предотвратить дополнительные свойства, такие как *На 1027 * воздействует только смежная клавиша properties.Мы ищем новое ключевое слово в draft-8 для поддержки такого поведения, но оно не похоже на то, что оно вам нужно в вашем примере ( Огромная проблема Github в отношении ).

Добавление additionalProperties false к схеме Speed теперь запрещает другие ключи в этом объекте.

Я ожидаю, что с учетом вашего названия вопроса, здесь может быть больше схемы, и вы упростили еена этот вопрос.Если у вас есть более подробная схема с более сложными проблемами, я с радостью вам помогу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...