我最近开始使用JSON schemas来开始执行API有效负载。我在定义遗留API的架构时遇到了一些障碍,遗留API具有一些非常糟糕的设计逻辑,这导致客户端滥用端点导致(以及糟糕的文档)。
到目前为止,这是架构:
{
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"object_id": {
"type": "string"
},
"question_id": {
"type": "string",
"pattern": "^-1|\\d+$"
},
"question_set_id": {
"type": "string",
"pattern": "^-1|\\d+$"
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"values": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"type",
"object_id",
"question_id",
"question_set_id",
"timestamp",
"values"
],
"additionalProperties": false
}
}
请注意,对于 question_id 和 question_set_id ,它们都采用可以是-1或其他非负整数的数字字符串。
我的问题:有没有办法强制执行如果 question_id 设置为-1,那么 question_set_id 也会设置为-1,反之亦然。
如果我可以通过解析器进行验证而不必在应用程序逻辑中进行检查,那将是非常棒的。
仅仅为了增加上下文,我一直在使用python的jsl模块来生成这个模式。
答案 0 :(得分:1)
您可以通过将以下内容添加到items
架构来实现所需的行为。它声明模式必须符合列表中的至少一个模式。两者都是“-1”或两者都是正整数。 (我假设您有充分的理由将整数表示为字符串。)
"anyOf": [
{
"properties": {
"question_id": { "enum": ["-1"] },
"question_set_id": { "enum": ["-1"] }
}
},
{
"properties": {
"question_id": {
"type": "string",
"pattern": "^\\d+$"
},
"question_set_id": {
"type": "string",
"pattern": "^\\d+$"
}
}
}