我有以下JSON模式:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"additionalProperties": false,
"properties": {
"Payload": {
"type": "object",
"additionalProperties": false,
"properties": {
"Person": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"Id": {
"type": "string"
},
"Name": {
"type": "string"
}
},
"required": [
"Id",
"Name"
]
}
}
}
},
"Reference": {
"type": "object",
"additionalProperties": false,
"properties": {
"Status": {
"anyOf": [
{
"Passed": {
"type": "string"
},
"Failed": {
"type": "string"
}
}
]
}
}
}
},
"anyOf": [
{
"additionalProperties": false,
"properties": {
"Status": {
"type": "string",
"enum": [
"Failed"
]
}
},
"required": [
"Reference"
],
"not": {
"required": [
"Payload"
]
}
},
{
"additionalProperties": true,
"properties": {
"Status": {
"type": "string",
"enum": [
"Passed"
]
}
},
"required": [
"Reference"
]
}
]
}
我想检查JSON消息的状态是否失败,然后不存在人员数组。 仅在状态通过时才应显示。
我尝试遵循solution here,但由于验证者通过了失败状态和人员详细信息,因此我肯定做错了。有人可以告诉我我可能做错了吗?
答案 0 :(得分:1)
您遇到了一些问题。
/ properties / Reference / properties / Status
这不是有效的架构。看来您要描述一个枚举。
其他属性
原因很复杂,但是条件模式不适用于additionalProperties
。好消息是它也是不必要的。您可以将它们排除在外。
/ anyOf
看起来您使用的是“枚举”模式,但是在这种情况下,隐含模式更好,因为只有一个枚举状态具有附加约束。
取决于嵌套属性
您定义Reference.Status
值的架构实际上只是指向Status
。您还需要一个描述父属性的架构。
以下内容是我认为您的架构试图做的。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"additionalProperties": false,
"properties": {
"Payload": {
"type": "object",
"additionalProperties": false,
"properties": {
"Person": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"Id": { "type": "string" },
"Name": { "type": "string" }
},
"required": ["Id", "Name"]
}
}
}
},
"Reference": {
"type": "object",
"additionalProperties": false,
"properties": {
"Status": { "enum": ["Passed", "Failed"] }
}
}
},
"anyOf": [
{
"not": {
"properties": {
"Reference": {
"properties": {
"Status": { "enum": ["Failed"] }
},
"required": ["Status"]
}
},
"required": ["Reference"]
}
},
{ "not": { "required": ["Payload"] } }
]
}