проверка jsonschema с условным форматом - PullRequest
0 голосов
/ 24 октября 2018

У меня есть схема, к которой я хочу добавить ключевое слово "format", но только в определенных случаях.У меня есть jsconschema draft 07, и я пытаюсь использовать операторы if / else, однако, я думаю, что начинаю понимать, что вы не можете добавить форматирование при использовании ключевых слов if / else.

Вот моя схема:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://json-schema.org/draft-07/schema#",
  "title": "Core schema meta-schema",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "theToggler": {
      "type": "string"
    },
    "mysession": {
      "$ref": "#/definitions/mysession"
    }
  },
  "definitions": {
    "mysession": {
      "type": "object",
      "properties": {
        "theID": {
          "type": "string",
          "example": "test@email.om",
          "description": "no format"
        }
      }
    }
  },
  "if": {
    "theToggler": "testme"
  },
  "then": {
    "definitions": {
      "mysession": {
        "type": "object",
        "properties": {
          "theID": {
            "type": "string",
            "format": "email"
          }
        }
      }
    }
  }
}

и вот мой ввод:

{
  "theToggler": "testme",
  "mysession": {
    "theID": "test"
  }
}

Вы могли бы подумать, что это бросает стрелку (если 'theToggler' = "testme "тогда theID должен иметь знак @, потому что я определяю формат" электронной почты ". Я делаю что-то не так, или это не поддерживается, или вы видите что-то еще, что я мог бы пропустить?

Спасибо!

PS Я тестирую его в https://www.jsonschemavalidator.net

1 Ответ

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

У вас есть ряд проблем.

Прежде всего, похоже, что вы использовали мета-схему в качестве примера.Это нормально, но вы не можете повторно использовать метасхему $id.Ваша схема должна иметь уникальное $id или вообще не иметь.

Ключевые слова if и then должны быть схемами.Если экземпляр действителен для схемы if, тогда схема then также должна быть действительной.

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "theToggler": { "type": "string" },
    "mysession": { "$ref": "#/definitions/mysession" }
  },
  "allOf": [
    {
      "if": { "$ref": "#/definitions/thetoggler-is-testme" },
      "then": { "$ref": "#/definitions/mysession-id-is-an-email" }
    }
  ],
  "definitions": {
    "mysession": {
      "type": "object",
      "properties": {
        "theID": {
          "type": "string",
          "example": "test@email.om",
          "description": "no format"
        }
      }
    },
    "thetoggler-is-testme": {
      "properties": {
        "theToggler": { "const": "testme" }
      }
    },
    "mysession-id-is-an-email": {
      "properties": {
        "mysession": {
          "properties": {
            "theID": { "format": "email" }
          }
        }
      }
    }
  }
}
...