【问题标题】:How to combine a property type, to match another properties type如何组合一个属性类型,以匹配另一个属性类型
【发布时间】:2019-08-26 10:00:55
【问题描述】:

我有以下使用 JSON 模式的用例。我有一个设置的元数据对象。在我们的例子中,设置可以是 string/real/integer/boolean 类型。

在这个对象中,我有 4 个字段:默认/最小值/最大值,每个字段都定义了设置的一个属性。 现在我想要实现的是,当de默认值的类型是整数时,最小/最大值也是整数。

到目前为止我想出的架构:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "setting-value": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        },
        {
          "type": "boolean"
        }
      ]
    },
    "setting-meta": {
      "type": "object",
      "required": [
        "name",
        "type",
        "default"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "type": {
          "type": "string",
          "enum": [
            "Real",
            "Integer",
            "Boolean",
            "String"
          ]
        },
        "minimum": {
          "$ref": "#/definitions/setting-value"
        },
        "maximum": {
          "$ref": "#/definitions/setting-value"
        },
        "default": {
          "$ref": "#/definitions/setting-value"
        },
        "value": {
          "$ref": "#/definitions/setting-value"
        }
      }
    }
  }
}

在这里,#/definitions/setting-meta 可以支持不同的类型。但是它并没有定义如果例如 TYPE 的值等于 Real/Integer,那么 minimum/maximum/default/value 的类型都应该是 number 类型。

我会使用这些定义如下

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$ref": "schema-definition-above.json#/definitions/setting-meta"
}

根据当前架构,以下所有示例都是有效的,但是它们应该是有效/无效的:

有效的 JSON 对象:

{
    "name": "Enabled",
    "type": "Boolean",
    "minimum": false,
    "maximum": true,
    "default": true,
    "value": true
}

无效的json对象,最小值/最大值/默认值不一样:

{
    "name": "Enabled",
    "type": "Boolean",
    "minimum": false,
    "maximum": 1,
    "default": "value",
    "value": true
}

无效的 json 对象:类型,与值的实际类型不匹配

{
    "name": "Enabled",
    "unit": "enabled/disabled",
    "configId": "Accumulator",
    "displayName": "Enable or disable this machine",
    "type": "Integer",
    "minimum": false,
    "maximum": true,
    "default": true,
    "value": true
}

我的问题: 是否可以将这些类型的依赖项放入 JSON 模式?到目前为止,我发现的唯一一种依赖关系是属性依赖关系,表明如果设置了一个属性,则还应该设置另一个属性。

任何帮助将不胜感激。

编辑: 使用一些 JSON 对象扩展了该用例,这些对象应该使用引用的架构进行验证或无效。

【问题讨论】:

  • 目前您的架构只有定义。您能否修改它以具有一些验证约束?那我可以帮忙。如果您还提供一些您希望有效和无效的示例,我可以更快地提供帮助
  • 您好 Relequestual,感谢您的回复。我按照您的建议添加了一些示例,希望这可以使问题更加清晰。

标签: json jsonschema


【解决方案1】:

为了在您有一组已知的可能条件的情况下进行条件验证,您应该使用if/then/else 关键字,并结合allOf

在此架构中,allOf 中的第一个架构定义了您的一般结构和总体要求。如果 if 架构验证成功,则第二个架构应用 then 约束。

您需要为每个条件复制第二个架构。

您可以在https://jsonschema.dev 看到此架构(链接预加载了以下架构和示例数据)

patternProperties 的使用只是节省空间。您可以单独定义每个属性。)

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "allOf": [
    {
      "properties": {
        "type": {
          "enum": [
            "Real",
            "Integer",
            "Boolean",
            "String"
          ]
        }
      },
      "required": [
        "type",
        "default",
        "name"
      ]
    },
    {
      "if": {
        "properties": {
          "type": {
            "const": "String"
          }
        }
      },
      "then": {
        "patternProperties": {
          "^(minimum|maximum|default|value)$": {
            "type": [
              "string"
            ]
          }
        }
      }
    }
  ]
}

【讨论】:

  • 非常感谢您的回复,这对我帮助很大。您对 Internet 上解决此类主题的一些更高级的指南有任何指示吗?我发现很难找到那些使用谷歌搜索的人。
  • 不客气。不幸的是,像这样的最新指南并不多。我们没有空闲时间来更新学习资源。您最好在 SO 上发布定期帮助或加入官方 slack(无论如何我们都会在其中监控 SO)。链接在网站上作为“讨论”。
  • 我有一个后续问题,是否有:if ... then ... elsif ... then .. 一种结构,或者必须在“then”中应用嵌套 if "声明?
  • 没有别的如果。您可以嵌套在 then 内,但最好在 allOf 内创建一个额外的架构并根据您的要求进行修改。
  • 所以我的 allOf, 将简单地拥有一个带有“if type == >type, then ...”的对象数组。清除。谢谢。
猜你喜欢
  • 2022-12-19
  • 2021-04-02
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多