Как расширить схему в схеме JSON? - PullRequest
0 голосов
/ 29 сентября 2018

Я использую схему JSON для моделирования данных.Я определяю базовую схему Document, которую позже использую для определения схем модели (например, Product, Category, User и т. Д.).

Я делаю это, потому что хочу, чтобы все модели наследовали определенную структуру / правила.Например, каждый экземпляр модели должен иметь определенные общие свойства (например, id, createdAt, updatedAt).В терминологии ООП: Product extends Document и, следовательно, он наследует свои свойства экземпляра.В терминологии схем (я думаю) Document - это мета-схема для создания схем моделей.

Я определил схему документа следующим образом:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://example.com/schemas/document.json#",
  "title": "Document",
  "type": "object",
  "additionalProperties": false,
  "required": ["type", "name", "fields"],
  "properties": {
    "type": {
      "constant": "document"
    },
    "name": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "readOnly": {
      "type": "boolean"
    },
    "properties": {
      // common properties 
      // model-specific properties
    }
  }
}
  1. Как сделатьЯ указываю, что мета-схема Document «расширяет» базовую схему JSON (draft-07), так что мне не нужно определять все свойства черновика ($schema, id и т. Д.)?
  2. Как указать, что properties каждой схемы модели содержит некоторые общие свойства (id, createdAt, ...), без необходимости определять их в каждом определении схемы модели?

1 Ответ

0 голосов
/ 30 сентября 2018

Схема JSON не использует объектно-ориентированную парадигму, поэтому такие понятия, как наследование, плохо транслируются.Схема JSON представляет собой набор ограничений.Это субтрактивный, а не аддитивный, как большинство людей привыкли.Это означает, что для пустой схемы набор допустимых документов JSON является набором всех документов JSON.При добавлении ключевых слов вы вычитаете из набора допустимых документов JSON.Как только что-то удалено из набора, оно не может быть добавлено обратно.

Таким образом, вы можете использовать композицию для «расширения» схемы, но вы никогда не сможете «переопределить» то, что определяет другая схема.

/ схема / база

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" }
    "bar": { "type": "string" }
  }
}

/ схема / расширенная

{
  "allOf": [{ "$ref": "/schema/base" }],
  "properties": {
    "baz": { "type": "string" }
  }
}

Здесь было простое расширение, котороепрекрасно работает со схемой JSON.

/ schema / override

{
  "allOf": [{ "$ref": "/schema/base" }],
  "properties": {
    "bar": { "type": "integer" },
    "baz": { "type": "boolean" }
  }
}

В этом примере обе схемы имеют поле /properties/bar.Если вы думаете об этом с точки зрения наследования, вы неправильно поймете, что здесь происходит.В этом случае оба поля"/ properties / bar" должны быть действительными.Нет конфликта для разрешения.Как говорит ключевое слово, «все» схемы должны быть действительными.

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

...