【问题标题】:How do I require only one of a set of properties are specified with json schema我如何只需要使用 json 模式指定一组属性中的一个
【发布时间】:2021-11-29 18:59:36
【问题描述】:

我有三个属性:一、二、三。

如果指定了其中一个属性,则不得包含其他两个属性。所以这是一个互斥规则。

我试图以简洁的方式编写此规则,但这似乎不起作用:

"oneOf": [
    {
        "required": ["one"],
        "not": {"required": ["two", "three"]}
    },
    {
        "required": ["two"],
        "not": {"required": ["one", "three"]}
    },
    {
        "required": ["three"],
        "not": {"required": ["one", "two"]}
    },
]

只有当所有三个都指定在一起而不是一个以上时才会引发错误。我几乎想要一个枚举之类的东西,但是对于属性 - 能够说只能指定这个属性列表中的一个。

编辑

每个用户 cmets 我删除了 nots 并且有效,但我对错误消息感到非常失望:

- (root): Must validate one and only one schema (oneOf)
- myObj.0: Must validate one and only one schema (oneOf)

超级没用。它没有说明哪些属性未通过验证。有没有一种方法来描述这种情况,用户会得到一个看起来更像的错误:

- myObj.0: Must include one and only one of properties one, two, or three

否则,它会让您一头雾水,并迫使您查看实际架构而不是使其更加明显。

【问题讨论】:

  • 只需删除nots。 oneOf 已经是一个互斥约束。您不需要手动执行该部分。如果稍后我有时间,我会回答这个问题,并解释为什么您的 nots 不能按照您认为的方式工作。
  • 我应该知道的!但请看我的编辑。虽然这可以正常工作,但错误消息令人沮丧。有没有办法描述这条规则,为我的用户提供更好的信息?
  • 错误消息将特定于实现。这是在模式中表达此约束的最佳方式。您无法在架构中进行任何更改以使消息传递更好。您能做的最好的事情就是要求实施改进他们的消息传递。
  • 现在在规范中定义了标准错误消息格式——您可以要求实现遵循该格式。它包括数据中的位置和模式中发生错误的位置。

标签: jsonschema


【解决方案1】:

您可以将maxProperties: 1additionalProperties: false 一起使用。

additionalProperties: false 防止包含您未定义的属性,这意味着他们拥有可以使用您的属性,但随后maxProperties: 1 将要求他们只能使用其中一个。

【讨论】:

    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 2019-12-08
    • 2020-12-02
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多