Json模式中的一个接受一个案例及其否定

Json模式中的一个接受一个案例及其否定,json,jsonschema,Json,Jsonschema,我使用一个Json模式,如下所示。它由两个定义组成,请求和响应 如果请求无效,则不允许响应。但是,如果请求有效,则会有响应 下面是两个我认为可行的json示例: { "request": { "valid": true }, "response": { "uuid": "12345678901234567890123456789012", "datetime": "123456789012345678901234", "seconds": 10 } }

我使用一个Json模式,如下所示。它由两个定义组成,
请求
响应

如果
请求
无效,则不允许
响应
。但是,如果
请求
有效,则会有
响应

下面是两个我认为可行的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
中指出的。我应该在指出错误和显示备选方案方面做得更好。这令人困惑。