Условно применять дополнительные свойства к дочернему элементу, но не к родительскому, который ссылается на него - PullRequest
1 голос
/ 02 мая 2019

Я хочу реализовать две схемы, одна из которых является массивом другой, давайте назовем эту полезную нагрузку B, а другую полезную нагрузку A.

Проблема: родительской схеме требуется дополнительный ключ, который дочерняя схема не может допустить.

Полезная нагрузка A:

{
  "a": "a",
  "b": "b",
  "c": "2019-05-01T09:00:00Z"
}

реализовано со схемой:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "item-schema.json",
  "title": "Individual Item POST",
  "description": "",
  "type": "object",
  "properties": {
    "a": {
      "type": "string"
    },
    "b": {
      "type": "string"
    },
    "c": {
      "type": "string",
      "format": "date-time"
    }
  },
  "additionalProperties": false,
  "required": [
    "a",
    "b",
    "c"
  ]
}

Полезная нагрузка B:

[
  {
    "a": "aa",
    "b": "bb",
    "c": "2019-05-01T10:00:00Z",
    "d": "dd"
  },
  {
    "a": "aaa",
    "b": "bbb",
    "c": "2019-05-01T11:00:00Z",
    "d": "ddd"
  }
]

реализовано со схемой:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "items-schema.json",
  "title": "Multiple Item POST",
  "description": "",
  "type": "array",
  "items": {
    "allOf": [
      {
        "$ref": "item-schema.json"
      },
      {
        "properties": {
          "d": {
            "type": "string"
          }
        }
      }
    ]
  },
  "additionalItems": false
}

Проблема, с которой я столкнулся, заключается в том, что, хотя полезная нагрузка A проверена правильно и не допускает посторонних ключей, полезная нагрузка B недопустима из-за схемы полезной нагрузки A.

1 Ответ

2 голосов
/ 02 мая 2019

Единственный способ добиться того, чего вы хотите с помощью JSON-схемы draft-7, - это иметь дублирование в вашей схеме.

Вам нужно изменить allOf/1, чтобы иметь properties:a,b,c:true (помните, что булевы значениясхемы) и добавьте additionalProperties:false.

И вам придется удалить additionalProperties:false из item-schema.json.

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

Признавая, что это не супер, мы работалитрудно (я одобрил PR. Реквизиты для остальной основной команды!), чтобы создать новое ключевое слово для draft-8 unevaluatedProperties.Вы можете прочитать об этом по адресу https://github.com/json-schema-org/json-schema-spec/issues/556.

Если это вызывает утешение, в спецификации OpenAPI есть та же проблема, которая объясняется в проблеме, упомянутой выше.

...