properties - 需要和/或有条件需要的属性的 jsonschema 验证

标签 properties conditional option-type jsonschema required

我需要验证一个始终具有 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/

相关文章:

perl - 这个 Perl 条件是做什么的?

C++ 隐式转换为 bool

swift - 可选的绑定(bind)、捕获引用和闭包 [可能的错误]

iphone - CABasicAnimation 没有为我的属性(property)设置动画

java - 使用带有 JSF <SelectItems> 标记的 Apache 配置时出现问题

r - 排除后续重复行

java - 我怎样才能安全地向上转型可选?

ios - 在 Swift 中展开 Optional Int

c# - 封装在哪里?

javascript - 测试是否存在嵌套的 JavaScript 对象键