我需要验证一个始终具有 2 个属性的 json 对象:
- 输入
- 姓名
类型可以是“A”、“B”或“C”,
当类型为“A”时,属性“foo”也是必需的,并且不允许其他属性。
确定:
{
"type": "A",
"name": "a",
"foo": "a",
}
不正常:
{
"type": "A",
"name": "a",
"foo": "a",
"lol": "a"
}
当类型为“B”时,属性“bar”是必需的,不允许附加属性。
当类型为“C”时,属性“bar”是必需的,并且可选地也可以存在“zen”属性。
确定:
{
"type": "C",
"name": "a",
"bar": "a",
"zen": "a"
}
{
"type": "C",
"name": "a",
"bar": "a",
}
不正常:
{
"type": "C",
"name": "a",
"bar": "a",
"lol": "a"
}
不幸的是,这个 question 的出色答案部分涵盖了我的案例,但是我没有设法构建适合我的 jsonschema。
编辑:
这是我尝试过的。
{
"$schema": "http://json-schema.org/draft-04/schema",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["A", "B", "C"]
},
"name": {"type": "string"},
"foo": {"type": "string"},
"bar": {"type": "string"},
"zen": {"type": "string"},
},
"anyOf": [
{
"properties": {"type": {"enum": ["A"]}},
"required": ["foo"],
},
{
"properties": {"type": {"enum": ["B"]}},
"required": ["bar"],
},
{
"properties": {"type": {"enum": ["C"]}},
"required": ["bar"],
},
]
}
我的问题是,在“anyOf”中的对象内将字段“additionalProperties”设置为 false 并没有给我预期的结果。
例如下面的 json 尽管有额外的属性“lol”但通过了验证
{
"type": "A",
"name": "a",
"foo": "a",
"lol": "a"
}
最佳答案
JSON Schema 是一个约束系统,其中每个子模式的约束分别进行评估。这意味着“additionalProperties”只能“看到”同一直接模式对象中的“属性”或“patternProperties”。
此外,它不能“查看”基于“必需”的属性,只能“查看”“属性”和“模式属性”。
据我所知,如果您在 anyOf 的 each 分支内设置 "additionalProperties": false,则这些都不应该起作用,因为唯一允许的属性是 "type"。如果您这样做并且它允许除“类型”之外的属性,那么我想知道您使用的是什么实现。
关于properties - 需要和/或有条件需要的属性的 jsonschema 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46649066/