jsonschema расширяется и без дополнительных свойств - PullRequest
1 голос
/ 10 ноября 2019

Я использую jsonschema для проверки типов записей, которые описывают, как отображаются записи (заданных типов). эти записи могут иметь страницы и разделяться на аспекты.

Обе страницы и аспекты могут быть обусловлены, и я хочу повторно использовать базовую схему, даже если условие для аспектов может иметь 2 других свойства, которые не соответствуют условиям страницыhave.

Это общая проблема, с которой я всегда сталкиваюсь. Я хочу расширить схему, но в любом случае иметь возможность установить для «AdditionalProperties» значение false.

Я также не вижу возможности исправить ее с помощью anyOf, allOf без дубликатов.

Или мне лучше отпустить additionalProperties или принять дубликаты?


  {
    "$comment": "page condition",
    "type": "object",
    "properties": {
      "condition": {
        "type": "object",
        "properties": {
          "aspect": {
            "type": "string"
          },
          "value": {
            "type": "string"
          },
          "compare": {
            "type": "string"
          }
        },
        "required": [
          "aspect",
          "value"
        ],
        "additionalProperties": false
      }
    }
  }

...
  {
    "$comment": "aspect condition",
    "type": "object",
    "properties": {
      "condition": {
        "type": "object",
        "properties": {
          "aspect": {
            "type": "string"
          },
          "value": {
            "type": "string"
          },
          "compare": {
            "type": "string"
          },
          "disabled_text": {
            "type": "string"
          },
          "default_pass": {
            "type": "boolean"
          }
        },
        "required": [
          "aspect",
          "value"
        ],
        "additionalProperties": false
      }
    }
  }

1 Ответ

1 голос
/ 11 ноября 2019

К сожалению, нет способа обойти это с помощью JSON-схемы draft-7.

Вам необходимо удалить additionalProperties: false из любой схемы, на которую вы хотите сослаться.

Один из способов минимизировать дублирование -в ссылочной схеме измените свойства, но только со значением true. Это означает, что часть проверки по-прежнему происходит в самих ссылочных схемах.

Я показал это в качестве примера проблемы, которую нужно исправить в недавнем выступлении на этом слайде: https://stoic -agnesi-d0ac4a.netlify.com/ 32

Часть полученной схемы:

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "definitions": {
    "geneticsPatient": {
      "type": [
        "object"
      ]
    },
    "regularPatient": {
      "type": [
        "object"
      ]
    }
  },
  "properties": {
    "patient": {
      "additionalProperties": false,
      "properties": {
        "name": true,
        "phenotypicFeatures": true,
        "genomicFeatures": true
      },
      "allOf": [
        {
          "$ref": "#/definitions/regularPatient"
        },
        {
          "$ref": "#/definitions/geneticsPatient"
        }
      ]
    }
  }
}

В черновик 2019-09, который выпущен только недавно, мы добавили новое ключевое слово, хотя вам все еще нужноне определять additionalProperties: false в ссылочной схеме.

Подробнее об этом можно узнать на других моих слайдах: https://speakerdeck.com/relequestual/json-schema-draft-8-to-vocabularies-and-beyond

...