我可以使用if / then来强制执行与先前给出的约束相反的属性约束吗?

时间:2019-06-06 18:49:41

标签: json jsonschema

我正在使用a multi-part JSON schema(但是JSON模式是新手)。 模式在配置文件上放置约束,配置文件包含资源模板,每个资源模板都包含属性模板。 我正在尝试更改对任何给定属性模板中的属性实施约束的方式。

schema module for property templates中,对属性"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."
},

我想使用if if语句来指示是否另一个属性的值是-1(指示属性模板已添加到配置文件中但尚未填充值的指示符),它不必符合上述规则。实际上,在这种情况下,我想确保上面属性的值是空字符串。

我试图通过以下方式做到这一点:

"allOf": [

(此处还有一些if-thens)

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

(此处还有一些其他定义)

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

这种方法*根本上是错误的吗?

*这种方法=在现有的"allOf"内添加一个附加的if / then,在现有的"definitions"内添加一个附加的定义。

最后一点:我正在修改公开here公开的架构-原始作品不是我自己的,而是我自己尝试的一部分。 / p>

1 个答案:

答案 0 :(得分:0)

简而言之,JSON Schema验证关键字将约束添加到验证检查中。您以后将无法删除它们。

相反,您必须构造if/then/else块以形成所需的结果。

通过链接到的架构的外观,您似乎已经了解如何正确使用if/then/else

请注意,您可以嵌套if/then/else个块。这些关键字中的每个关键字的值都必须是JSON模式,它本身可以使用这些关键字。生成的嵌套thenelse模式将“弄乱”要在其应有的位置应用的适用性链。

本质上,没有关键字可以忽略其他使用过的关键字。