【发布时间】: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