如何在不同的属性类型上使用anyOf?

时间:2020-04-22 11:23:52

标签: jsonschema

在下面的架构中,我需要items_listpricevariance作为必需的键。条件为pricevariance可以为null,也可以不为null,但两者都不可以为null。

尽管我能够实现,但我期待是否有更短的方法来做到这一点。另外,我不确定将requiredadditionalProperties键放在哪里。

非常感谢您的帮助。

{
    "type": "object",
    "properties": {
        "items_list": {
            "type": "array",
            "items": {
                "type": "string"
            }
        },
    },
    "anyOf": [
        {
            "properties": {
                "price": {
                    "type": "number",
                    "minimum": 0,
                },
                "variance": {
                    "type": [
                        "number",
                        "null"
                    ],
                    "minimum": 0,
                },
            },
        },
        {
            "properties": {
                "price": {
                    "type": [
                        "number",
                        "null"
                    ],
                    "minimum": 0,
                },
                "variance": {
                    "type": "number",
                    "minimum": 0,
                },
            },
        },
    ],
    # "required": [
    #     "items_list",
    #     "price",
    #     "variance",
    # ],
    # "additionalProperties": False,
}

2 个答案:

答案 0 :(得分:3)

要回答这个问题,“它可以更短吗?”,答案是肯定的。一般的经验法则是从不定义布尔逻辑关键字中的任何内容。仅使用布尔逻辑关键字来添加复合约束。我使用“复合约束”一词来表示基于架构中多个值的约束。在这种情况下,复合约束是价格和差异都不能为空。

{
  "type": "object",
  "properties": {
    "items_list": {
      "type": "array",
      "items": { "type": "string" }
    },
    "price": { "type": ["number", "null"], "minimum": 0 },
    "variance": { "type": ["number", "null" ], "minimum": 0 }
  },
  "required": ["items_list", "price", "variance"],
  "additionalProperties": false,
  "allOf": [{ "$ref": "#/definitions/both-price-and-variance-cannot-be-null" }],
  "definitions": {
    "both-price-and-variance-cannot-be-null": {
      "not": {
        "properties": {
          "price": { "type": "null" },
          "variance": { "type": "null" }
        },
        "required": ["price", "variance"]
      }
    }
  }
}

您不仅不必跳圈就能使additionalProperties正常工作,而且阅读起来也更容易。它甚至与您对问题的描述相匹配,“价格和方差可能为空,也可能不为空”(properties),但“两者均不能为空”(not(复合约束))。您可以通过内联定义使其更短,但我将其包括在内以说明该技术在仍比原始模式还短的情况下可以表现出什么表现力。

答案 1 :(得分:2)

看起来您基本上是正确的。这是放置required的正确位置。

使用additionalProperties: false,还需要在最高级别定义propertiesadditionalProperties不能“透视” *Of关键字(施加器)。

您可以添加properties: [prop] : true,但可以定义所有属性。 您需要执行此操作,因为additionalProperties仅在同一级别的同一架构对象中了解properties