Могу ли я использовать if / then для наложения ограничений на свойства, противоречащих ранее заданным? - PullRequest
2 голосов
/ 06 июня 2019

Я работаю с многокомпонентной схемой JSON (но я новичок в схемах JSON).Схема накладывает ограничения на профиль, который содержит шаблоны ресурсов, каждый из которых содержит шаблоны свойств.Я пытаюсь изменить способ применения ограничений к свойствам в любом данном шаблоне свойств.

В модуле схемы для шаблонов свойств ограничения накладываются на свойства "mandatory", "repeatable" и "type" следующим образом:

"mandatory": {
  "type": ["boolean", "string"],
  "enum": ["true", "false"],
  "title": "Mandatory",
  "description": "Indication that a value for the property is required. If unspecified, defaults to false.",
  "default": false
},

[...]

"repeatable": {
  "type": ["boolean","string"],
  "enum": ["true", "false"],
  "title": "Repeatable",
  "description": "Indication that the property is repeatable. If unspecified, defaults to true.",
  "default": true
},

[...]

"type": {
  "type": "string",
  "enum": ["literal", "lookup", "resource"],
  "title": "Type",
  "description": "Type of value (literal / resource / lookup) that is allowed by this property."
},

Iхотели бы использовать оператор if then, чтобы указать, что если значение другого свойства равно -1 (показатель того, что шаблон свойства был добавлен в профиль, но еще не заполнен значениями), он не должен соответствоватьправила выше.На самом деле, я хотел бы убедиться, что значения для свойств выше являются пустыми строками в этом случае.

Я пытался сделать это следующим образом:

"allOf": [

(некоторые другие if-thens здесь)

    {
        "if": {
            "properties": {
                "uwFormOrder": {
                    "const": -1
                }
            }
        },
        "then": {
            "$ref": "#/definitions/empty-PTs"
        }
    }
 ],
 "definitions": {

(некоторые другие определения здесь)

"empty-PTs": {
      "properties": {
        "mandatory": {
          "const": ""
        },
        "repeatable": {
          "const": ""
        },
        "type": {
          "const": ""
        }
      }
    }

Является ли этот подход * в корне неверным?

* Этот подход = добавление дополнительного if / затем внутри существующего "allOf", добавление дополнительного определения в существующий "definitions".

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

1 Ответ

0 голосов
/ 07 июня 2019

В упрощенном виде ключевые слова для проверки схемы JSON добавляют ограничения к проверке правильности. Вы не можете позже удалить их.

Вместо этого вы должны построить if/then/else блоков, чтобы получить желаемый результат.

Судя по схемам, с которыми вы связаны, кажется, вы уже понимаете, как правильно использовать if/then/else.

Как примечание, вы можете вкладывать if/then/else блоков. Значением каждого из этих ключевых слов должна быть схема JSON, которая сама может использовать эти ключевые слова. Результирующая вложенная схема then или else будет "пузыриться" по цепочке применимости, которая должна быть применена там, где она была предназначена.

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

...