Json模式中的一个接受一个案例及其否定
我使用一个Json模式,如下所示。它由两个定义组成,Json模式中的一个接受一个案例及其否定,json,jsonschema,Json,Jsonschema,我使用一个Json模式,如下所示。它由两个定义组成,请求和响应 如果请求无效,则不允许响应。但是,如果请求有效,则会有响应 下面是两个我认为可行的json示例: { "request": { "valid": true }, "response": { "uuid": "12345678901234567890123456789012", "datetime": "123456789012345678901234", "seconds": 10 } }
请求
和响应
如果请求
无效,则不允许响应
。但是,如果请求
有效,则会有响应
下面是两个我认为可行的json示例:
{
"request": { "valid": true },
"response":
{
"uuid": "12345678901234567890123456789012",
"datetime": "123456789012345678901234",
"seconds": 10
}
}
及
我在问为什么中的一个不能按预期工作?json文件,如
{
"request": { "valid": true }
}
验证为正确,即使没有它的请求部分
模式:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"request": {
"type": "object",
"properties": {
"valid": {
"type": "boolean",
"description": "Request was valid or not."
}
},
"required": ["valid"],
"additionalProperties": false
},
"response": {
"type": "object",
"properties": {
"uuid": {
"type": "string",
"description": "UUID of person which logged in.",
"maxLength": 36
},
"datetime": {
"type": "string",
"description": "Datetime of last interaction.",
"maxLength": 24
},
"seconds": {
"type": "integer",
"description": "Login valid in seconds.",
"minimum": 0
}
},
"required": ["uuid", "datetime", "seconds"],
"additionalProperties": false
}
},
"title": "login response",
"type": "object",
"oneOf": [{
"properties": {
"request": {
"valid": {
"const": false
}
}
},
"required": ["request"],
"additionalProperties": false
},
{
"properties": {
"request": {
"valid": {
"const": true
}
},
"response": {
"$ref": "#/definitions/response"
}
},
"required": ["request", "response"],
"additionalProperties": false
}
]
}
似乎您的
请求
属性未在其中一个中正确定义。这里有两种可能的解决方案。希望这会有帮助
解决方案01:将请求
定义移动到每个块中
"oneOf": [
{
"properties": {
"request": {
"type": "object",
"properties": {
"valid": {
"const": false
},
"required": [
"valid"
],
"additionalProperties": false
}
}
},
"required": [
"request"
],
"additionalProperties": false
},
{
"properties": {
"request": {
"type": "object",
"properties": {
"valid": {
"const": true
},
"required": [
"valid"
],
"additionalProperties": false
}
}
},
"response": {
"$ref": "#/definitions/response"
}
},
"required": [
"request",
"response"
],
"additionalProperties": false
}
]
解决方案02:对请求使用单独的定义
"definitions": {
"valid_request": {
"type": "object",
"properties": {
"valid": {
"const": true,
"description": "Request was valid"
}
},
"required": [
"valid"
],
"additionalProperties": false
},
"invalid_request": {
"type": "object",
"properties": {
"valid": {
"const": false,
"description": "Request was invalid"
}
},
"required": [
"valid"
],
"additionalProperties": false
}
}
似乎您的请求
属性未在其中一个
中正确定义。这里有两种可能的解决方案。希望这会有帮助
解决方案01:将请求
定义移动到每个块中
"oneOf": [
{
"properties": {
"request": {
"type": "object",
"properties": {
"valid": {
"const": false
},
"required": [
"valid"
],
"additionalProperties": false
}
}
},
"required": [
"request"
],
"additionalProperties": false
},
{
"properties": {
"request": {
"type": "object",
"properties": {
"valid": {
"const": true
},
"required": [
"valid"
],
"additionalProperties": false
}
}
},
"response": {
"$ref": "#/definitions/response"
}
},
"required": [
"request",
"response"
],
"additionalProperties": false
}
]
解决方案02:对请求使用单独的定义
"definitions": {
"valid_request": {
"type": "object",
"properties": {
"valid": {
"const": true,
"description": "Request was valid"
}
},
"required": [
"valid"
],
"additionalProperties": false
},
"invalid_request": {
"type": "object",
"properties": {
"valid": {
"const": false,
"description": "Request was invalid"
}
},
"required": [
"valid"
],
"additionalProperties": false
}
}
问题在于您的模式检查valid是否为true/false。请参见下面示例中的#/definitions/is valid request
。在这种情况下,我建议使用如果
/那么
/其他
而不是其中一个。这样您将得到更多有用的错误消息。下面是一个如何实现它的示例
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "login response",
"type": "object",
"properties": {
"request": { "$ref": "#/definitions/request" },
"response": { "$ref": "#/definitions/response" }
},
"additionalProperties": false,
"required": ["request"],
"allOf": [{ "$ref": "#/definitions/require-response-with-valid-request" }],
"definitions": {
"request": { ... },
"response": { ... },
"require-response-with-valid-request": {
"if": { "$ref": "#/definitions/is-valid-request" },
"then": { "required": ["response"] },
"else": { "not": { "required": ["response"] } }
},
"is-valid-request": {
"properties": {
"request": {
"properties": {
"valid": { "const": true }
},
"required": ["valid"]
}
},
"required": ["request"]
}
}
}
问题在于您的模式检查valid是否为true/false。请参见下面示例中的#/definitions/is valid request
。在这种情况下,我建议使用如果
/那么
/其他
而不是其中一个。这样您将得到更多有用的错误消息。下面是一个如何实现它的示例
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "login response",
"type": "object",
"properties": {
"request": { "$ref": "#/definitions/request" },
"response": { "$ref": "#/definitions/response" }
},
"additionalProperties": false,
"required": ["request"],
"allOf": [{ "$ref": "#/definitions/require-response-with-valid-request" }],
"definitions": {
"request": { ... },
"response": { ... },
"require-response-with-valid-request": {
"if": { "$ref": "#/definitions/is-valid-request" },
"then": { "required": ["response"] },
"else": { "not": { "required": ["response"] } }
},
"is-valid-request": {
"properties": {
"request": {
"properties": {
"valid": { "const": true }
},
"required": ["valid"]
}
},
"required": ["request"]
}
}
}
你能更新你正在使用的库吗?它可以提供对正在发生的事情的深入了解。您可以更新您正在使用的库吗?它可以让你洞察正在发生的事情。捕捉得好。就我个人而言,我会选择第一种方式。接得好。就我个人而言,我会选择第一个选项。@lahiruk实际上发现了这个问题。我也错过了。它不是
中的之一。这就是请求
的定义方式。OP缺少一个properties
关键字。对,这就是我在#/definitions/is valid request
中指出的。我应该在指出错误和显示备选方案方面做得更好。“这让人困惑。”拉希鲁克实际上发现了这个问题。我也错过了。它不是
中的之一。这就是请求
的定义方式。OP缺少一个properties
关键字。对,这就是我在#/definitions/is valid request
中指出的。我应该在指出错误和显示备选方案方面做得更好。这令人困惑。