有没有办法使用JSON模式在字段之间强制执行值?

时间:2016-03-16 20:01:56

标签: python json jsonschema

我最近开始使用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模块来生成这个模式。

1 个答案:

答案 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+$"
            }
        }
    }