1 Вопрос: Условно применять дополнительные свойства к дочернему элементу, но не к родительскому, который ссылается на него

вопрос создан в Thu, May 2, 2019 12:00 AM

Я хочу реализовать две схемы, одна из которых является массивом другой, давайте назовем эту полезную нагрузку 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
1 ответ                              1                         

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

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

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

Если вы не можете этого сделать, и вам нужен item-schema.json для самостоятельной работы ... тогда извините, вам не повезло, и вам придется скорее дублировать схему чем ссылаться на него.

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

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

    
1
2019-05-02 17: 29: 57Z
источник размещен Вот