Как использовать дополнительные свойства из файла $ ref? - PullRequest
2 голосов
/ 30 сентября 2019

Я разделил мои схемы JSON на два файла.

person-input.json (все свойства, которые будут установлены входными данными.)

person.json (удерживайте ссылку на person-input. json, но также имеют dateUpdate, dateCreated и DateDeleted).

Это позволяет отделить входные данные от автоматически сгенерированных свойств даты.

Я не хочу, чтобы какие-либо сообщения могли добавлять нежелательные свойства к моим данным, поэтому я подумал, что буду использовать "additionalProperties": false, проблема в том, что, если я использую его в файле person-input.json, он не приметмои свойства "date" из файла person.json. И если я добавлю его в файл person.json, это не остановит случайное добавление свойств. Есть ли этому решение?

, так что это ниже не работает, я неправильно указал "additionalProperties": false?

person.json

{
  "allOf": [
    {
      "$ref": "./person-input.json"
    },
    {
      "type": "object",
      "properties": {
        "dateCreated": {
        "name": "dateCreated",
        "type": "string",
        "description": "date created",
        "example": "2019-09-02T11:17:41.783Z"
        },
        "dateUpdated": {
          "type": "string",
          "nullable": true,
          "description": "date updated",
          "example": "2019-09-02T11:17:41.783Z"
        },
        "dateDeleted": {
          "type": "string",
          "nullable": true,
          "description": "date deleted",
          "example": "2019-09-02T11:17:41.783Z"
        }
      },
      "additionalProperties": false
    }
  ]
}

1 Ответ

3 голосов
/ 30 сентября 2019

additionalProperties не может "видеть сквозь" аппликаторы, такие как allOf, и при этом он не может "видеть сквозь" использование $ref.

Чтобы исправить это, вы должны сделать НЕКОТОРОЕ дублированиевашей схемы в вашей самой внешней / самой верхней схеме и удалите требование additionalProperties: false из любых дочерних схем.

additionalProperties: false работает, применяя false (которая является допустимой схемой, которая возвращает ошибку проверки) значениям, которые не совпадают с ключами на основе properties или patternProperties в пределах одного и того же объекта схемы.

Проверка с помощью «AdditionalProperties» применяется только к дочерним
значениям имен экземпляров, которыене совпадают никакие имена в "свойствах" и не совпадают ни с одним регулярным выражением в "patternProperties".

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5.6 (draft-7)

Итак,если вам нужно скопировать все нужные вам свойства в схему верхнего уровня. Да, это нехорошо!

Вы можете сделать это немного лучше, заметив тот факт, что значения объекта properties являются схемами, и поэтому могут быть просто true, позволяя дочерним схемамна самом деле сделайте проверку позже.

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

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "title": "MatchMakerExchange format for queries",
  "definitions": {
    "phenotypicFeatures": {
      "type": [
        "array"
      ]
    },
    "genomicFeatures": {
      "type": [
        "array"
      ]
    },
    "geneticsPatient": {
      "properties": {
        "phenotypicFeatures": {
          "$ref": "#/definitions/phenotypicFeatures"
        },
        "genomicFeatures": {
          "$ref": "#/definitions/genomicFeatures"
        }
      },
      "anyOf": [
        {
          "required": [
            "phenotypicFeatures"
          ]
        },
        {
          "required": [
            "genomicFeatures"
          ]
        }
      ]
    },
    "regularPatient": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": [
            "string"
          ]
        }
      }
    }
  },
  "properties": {
    "patient": {
      "additionalProperties": false,
      "properties": {
        "name": true,
        "phenotypicFeatures": true,
        "genomicFeatures": true
      },
      "allOf": [
        {
          "$ref": "#/definitions/regularPatient"
        },
        {
          "$ref": "#/definitions/geneticsPatient"
        }
      ]
    }
  }
}

Вы вполне можете спросить ... "Ну, этосумасшедший. Вы можете это исправить, пожалуйста? - Мы сделали. Он называется черновик 2019-09, и только недавно был выпущен, так что вам придется ждать, пока реализации догонят.

Новое ключевое слово unevaluatedProperties зависит от результатов аннотации, но вам все равно нужно удалить additionalProperties: false из дочерних схем.

...