我有一个遗留API我试图在
JSON模式中定义,并且该对象有一个奇怪的结构,其中有一组4个属性,其中任何一个都是必需的,其中3个是互斥的.之后是超过30个共享的可选属性,我会将它们视为….
例如.,
{ "foo": "bar","baz": 1234,... } // OK { "foo": "bar","buzz": 1234,... } // OK { "foo": "bar","fizz": 1234,... } // OK { "foo": 1234,... } // OK { "baz": 1234,... } // OK { ... } // NOT OK { "baz": 1234,... } // NOT OK
我可以做一个但是这不允许foo与其他人一起出现,anyOf允许baz,buzz和fizz彼此存在,这是不可能的.
我尝试定义如下内容:
{ "type": "object","properties": { "foo": {"type": "string"},"baz": {"type": "number"},"buzz": {"type": "number"},"fizz": {"type": "number"} },"anyOf": [ {"required": ["foo"]},{"required": [{"oneOf": [ {"required": ["baz"]},{"required": ["buzz"]},{"required": ["fizz"]} ]} ]} ] }
和
{ "type": "object",{"oneOf": [ {"required": ["baz"]},{"required": ["fizz"]} ] } ] }
但这不起作用,我只是不了解json架构还知道这是否可能.
解决方法
有趣!可能有一个更简洁的解决方案,但我们在这里……
{ "not": { "anyOf": [ {"required": ["baz","buzz"]},{"required": ["buzz","fizz"]},{"required": ["fizz","baz"]} ] } }
“至少一个”约束可以用anyOf表示:
{ "anyOf": [ {"required": ["foo"]},{"required": ["baz"]},{"required": ["fizz"]} } }
如果您只是将这两个约束组合到一个模式中,那么它应该工作:
{ "not": {"anyOf": [...]},"anyOf": ... }