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

时间:2018-04-25 16:32:41

标签: json jsonschema

我正在编写一些具有共享属性的对象的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在同一级别上具有这三个属性(平坦,未包装),并且不是< / strong>像这样:

"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 :(得分:0)

您可以使用oneOf实现此目的。 oneOf是一个异或的声明。 &#34; propertyA&#34;中的一个或另一个或&#34; propertyD&#34;而不是两者都可以在同一时间出现。

{
  "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
    }
  }
}