我在想出可以验证JSON是否包含以下任一内容的JSON模式时遇到了麻烦:
但如果存在多个则不匹配。
具体来说,我要
copyAll
fileNames
matchesFiles
doesntMatchFiles
进行验证,但我不想接受更多的验证。
这是到目前为止我得到的:
{ "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "required": [ "unrelatedA" ], "properties": { "unrelatedA": { "type": "string" }, "fileNames": { "type": "array" }, "copyAll": { "type": "boolean" }, "matchesFiles": { "type": "array" }, "doesntMatchFiles": { "type": "array" } }, "oneOf": [ {"required": ["copyAll"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["fileNames"]}}, {"required": ["fileNames"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["copyAll"]}}, {"anyOf": [ {"required": ["matchesFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}}, {"required": ["doesntMatchFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}}]} ] } ;
这比我想要的要匹配。我希望它符合以下所有条件:
{"copyAll": true, "unrelatedA":"xxx"} {"fileNames": ["aab", "cab"], "unrelatedA":"xxx"} {"matchesFiles": ["a*"], "unrelatedA":"xxx"} {"doesntMatchFiles": ["a*"], "unrelatedA":"xxx"} {"matchesFiles": ["a*"], "doesntMatchFiles": ["*b"], "unrelatedA":"xxx"}
但不符合:
{"copyAll": true, "matchesFiles":["a*"], "unrelatedA":"xxx"} {"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"} {"copyAll": true, "doesntMatchFiles": ["*b"], "matchesFiles":["a*"], "unrelatedA":"xxx"} {"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"} {"unrelatedA":"xxx"}
我猜想我有明显的失踪-我想知道它是什么。
问题是“非”语义。“不需要”不表示“禁止包含”。这只是意味着您不必添加它即可验证该架构。
但是,您可以使用“ oneOf”以更简单的方式满足您的规范。请记住,这意味着“只有这些模式之一可以验证”。以下架构实现了您要解决的属性切换:
{ "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "required": [ "unrelatedA" ], "properties": { "unrelatedA": { "type": "string" }, "fileNames": { "type": "array" }, "copyAll": { "type": "boolean" }, "matchesFiles": { "type": "array" }, "doesntMatchFiles": { "type": "array" } }, "oneOf": [ { "required": [ "copyAll" ] }, { "required": [ "fileNames" ] }, { "anyOf": [ { "required": [ "matchesFiles" ] }, { "required": [ "doesntMatchFiles" ] } ] } ] }