Метасхема с указанием обязательного атрибута для всех свойств - PullRequest
0 голосов
/ 03 июля 2018

Я хочу настроить метасхему так, чтобы все свойства имели дополнительный атрибут, например, как я могу требовать, чтобы во всех свойствах было указано "type"?

Тогда эта схема не будет работать:

{
    "$schema": "http://json-schema.org/schema#",
    "title": "...",
    "description": "...",
    "type": "object",
    "properties": {
        "name": {
            "description": "..."
        }
    }
}

Но этот должен преуспеть:

{
    "$schema": "http://json-schema.org/schema#",
    "title": "...",
    "description": "...",
    "type": "object",
    "properties": {
        "name": {
            "description": "...",
            "type": "string"
        }
    }
}

1 Ответ

0 голосов
/ 04 июля 2018

К сожалению, написание мета-схем не так просто. Над ним работают, но пока нет хорошего решения.

Вам нужно будет сделать копию мета-схемы, которую вы хотите расширить, и затем добавить "required": ["type"].

Но, пока мы здесь, возможно, я смогу убедить вас не делать этого. Если сделать ключевое слово type обязательным, то в некоторых случаях возникают проблемы. Вот несколько примеров. https://github.com/json-schema/json-schema/issues/172#issuecomment-124214534

EDIT

Обсудив это далее, мы обнаружили, что в данном конкретном случае нет проблем, с которыми мы обычно сталкиваемся при расширении мета-схем, поскольку он не должен быть рекурсивным. Вот пример расширения схемы draft-06 для включения нового ключевого слова с именем custom, которое является логическим и требуется только на верхнем уровне схемы properties.

{
  "allOf": [
    { "$ref": "http://json-schema.org/draft-06/schema#" },
    {
      "properties": {
        "properties": {
          "patternProperties": {
            ".*": {
              "properties": {
                "custom": { "type": "boolean" }
              },
              "required": ["custom"]
            }
          }
        }
      }
    }
  ]
}

А вот пример схемы, которая соответствует этой мета-схеме.

{
  "properties": {
    "foo": {
      "custom": true,
      "not": { "type": "string" }
    }
  }
}

Ключевое слово custom требуется для схемы "foo", но не для схемы not или схемы верхнего уровня.

...