首页 文章

合并两个JSON模式对象的属性

提问于
浏览
2

我正在编写一些JSON模式,其中包含一些具有共享属性的对象 .

在JSON模式1中:

...
"properties": {
    "someProperty": {
        "type": "object",
        "required": [
            "propertyA",
            "propertyB",
            "propertyC",
        ],
        "additionalProperties": false,
        "properties": {
            "propertyA": {
                "type": "integer"
            },
            "propertyB": {
                "type": "integer"
            },
            "propertyC": {
                "type": "integer"
            }
        }
    }
}
...

在JSON模式2中:

...
"properties": {
    "someProperty": {
        "type": "object",
        "required": [
            "propertyD",
            "propertyB",
            "propertyC",
        ],
        "additionalProperties": false,
        "properties": {
            "propertyD": {
                "type": "integer"
            },
            "propertyB": {
                "type": "integer"
            },
            "propertyC": {
                "type": "integer"
            }
        }
    }
}
...

因此,这两个对象( someProperty )之间的唯一区别是 propertyApropertyD .

因此,我决定创建一个通用的JSON模式,其中包含这两个共享属性 propertyBpropertyC 的定义 .

一种解决方案是在公共模式中定义一个包含这两个属性的对象,但是我希望我的JSON在同一级别上具有这三个属性(flat,unwrap),并且 not 如下所示:

"someProperty": {
    "propertyA": 2,
    "sharedObject": {
        "propertyB": 3,
        "propertyC": 4
    }
}

我想要的是什么?我想最终得到一些能使我的JSON有效的东西:

"someProperty": {
    "propertyA": 2,
    "propertyB": 3,
    "propertyC": 4
}

和:

"someProperty": {
    "propertyD": 2,
    "propertyB": 3,
    "propertyC": 4
}

所有这些属性都为 required 且不允许 additionalProperties .

1 回答

  • 0

    您可以使用 oneOf 实现此目的 . oneOf 是一个独家OR声明 . "propertyA"或"propertyD"中的一个或另一个可以同时出现 .

    {
      "type": "object",
      "properties": {
        "someProperty": {
          "type": "object",
          "properties": {
            "propertyA": {
              "type": "integer"
            },
            "propertyB": {
              "type": "integer"
            },
            "propertyC": {
              "type": "integer"
            },
            "propertyD": {
              "type": "integer"
            }
          },
          "required": ["propertyB", "propertyC"],
          "oneOf": [
            { "required": ["propertyA"] },
            { "required": ["propertyD"] }
          ],
          "additionalProperties": false
        }
      }
    }
    

相关问题