我似乎无法弄清楚如何在JSON模式中实现某些功能。我们假设我有两个字段:status
和quote
。
条件依赖关系如下:
status
为["Y", "N"]
,那么quote
必需 status
是enum的其他内容,则quote
不需要 status
,则quote
可以是任何我正在尝试使用以下架构实现此行为:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"quote": {
"type": "string",
},
"status": {
"type": "string",
"enum": ["Y", "N", "M", "A", "S"]
}
},
"oneOf": [
{
"properties": {
"status": {"enum": ["Y", "N"]}
},
"required": [
"quote"
]
},
{
"properties": {
"status": {"enum": ["Y", "N", "M", "A", "S"]}
}
}
]
}
前两个条件按预期工作,但只要从JSON中遗漏status
字段,验证就会失败。想要的行为是,只要quote
字段不在那里,我就可以有一个字段status
。
我怎样才能做到这一点?
所以我设法实现了我最初的要求,但是,我现在有了额外的要求。也就是说,只要author
为status
,我就会需要一个额外的字段["M", "A"]
,否则它只是可选的。如果status
不存在,则quote
和author
都可以是任何内容。我尝试过如下:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"quote": { "type": "string" },
"author": { "type": "string" },
"status": { "enum": ["Y", "N", "M", "A", "S"] }
},
"allOf": [
{ "$ref": "#/definitions/y-or-n-requires-quote" },
{ "$ref": "#/definitions/m-or-a-requires-author" }
],
"definitions": {
"y-or-n-requires-quote": {
"anyOf": [
{ "not": { "$ref": "#/definitions/status-is-y-or-n" } },
{ "required": ["quote"] }
]
},
"m-or-a-requires-author": {
"anyOf": [
{ "not": { "$ref": "#/definitions/status-is-m-or-a" } },
{ "required": ["author"] }
]
},
"status-is-y-or-n": {
"properties": {
"status": { "enum": ["Y", "N"] }
}
},
"status-is-m-or-a": {
"properties": {
"status": { "enum": ["M", "A"] }
}
}
}
}
但是,使用此架构并不适用于status
不存在的JSON。
答案 0 :(得分:1)
您需要使用一个名为implication(!A或B)的布尔逻辑概念。它是表达if-then约束的一种方式。在这种情况下,我们想要表达的是:要么状态不是" Y" /" N"或引用是必需的。
for i..
答案 1 :(得分:1)
请注意,草案07添加"如果" /"那么" /"否则"使条件更容易的关键字:
https://tools.ietf.org/html/draft-handrews-json-schema-validation-00#section-6.6
如果您的工具不支持draft-07,请考虑提交功能请求以便让他们更新: - )