如何为两个对象设计 json 架构?

问题描述 投票:0回答:1

我想要一种模式来验证有很多重叠的两种不同类型的对象。考虑以下 json 模式:

{
  "properties": {
    "a":{"const":1}
  },
  "oneOf": [
    { "properties": { "b":{"const":2}}},
    { "properties": { "c":{"const":3}}}
  ],
  "additionalProperties":false
}

显然,这总是会失败,因为对象必须有“a”并且只有“a”,并且还必须有“b”或“c”,这是一个矛盾。

我当然可以像这样重新排列它:

{
  "oneOf": [
    { "properties": { "a":{"const":1}, "b":{"const":2}}, "additionalProperties": false},
    { "properties": { "a":{"const":1}, "c":{"const":3}}, "additionalProperties": false}
  ]
}

这就是我的预期行为。但我不喜欢它。因为“a”上的规则无法重用。如果我需要重用很多属性怎么办?我喜欢类似于第一个模式的形式,但其功能类似于第二个模式。是否可以重用“a”的规则并获得预期的功能?

jsonschema
1个回答
0
投票

您可以采用第一种方法并使用

unevaluatedProperties
而不是
additionalProperties

additionalProperties
无法“查看”相邻关键字的子模式,但
unevaluatedProperties
可以并且是专门为此目的添加的。

{
  "properties": {
    "a":{"const":1}
  },
  "oneOf": [
    { "properties": { "b":{"const":2}}},
    { "properties": { "c":{"const":3}}}
  ],
  "unevaluatedProperties":false
}

您需要至少使用 2019-09 版草案才能拥有

unevaluatedProperties
关键字。 理想情况下,您无论如何都要指定
$schema
(和
$id
)。

您可以在我的游乐场上测试这个,https://json-everything.net/json-schema

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.