使用Ajv

时间:2017-03-05 02:10:29

标签: jsonschema ajv

我正在尝试验证“actions”数组是否具有特定对象。每个对象都可以拥有自己的属性,具体取决于type属性。 actions数组可以从这些类型的对象中出现多个,而不仅仅是一个。

我的JSON:

{
    "actions": [
        {
            "type": "X",
            "a": 1,
            "b": 2,
            "c": 3
        },
        {
            "type": "Y",
            "d": 1,
            "e": 2,
            "f": 3
        }
    ]
}

在此示例中,type = X的对象具有a,b,c所需的属性。数组中的对象类型Y具有必需的属性d,e,f。

我正在尝试使用switch关键字验证这一点:

{
    "type": "object",
    "required": [
        "actions"
    ],
    "properties": {
        "actions": {
            "type": "array",
            "items": {
                "switch": [
                    {
                        "if": {
                            "properties": {
                                "type": {
                                    "pattern": "^X$"
                                }
                            }
                        },
                        "then": {
                            "required": [
                                "a",
                                "b",
                                "c"
                            ]
                        }
                    },
                    {
                        "if": {
                            "properties": {
                                "type": {
                                    "pattern": "^Y$"
                                }
                            }
                        },
                        "then": {
                            "required": [
                                "d",
                                "e",
                                "f"
                            ]
                        }
                    }
                ]
            }
        },
    }
}

但我仍然无法弄清楚如何使用switch关键字来验证数组的对象,其中每个对象类型由对象中的属性指定,因此可以使用属性来标识对象类型。

1 个答案:

答案 0 :(得分:1)

您的架构看起来几乎没问题,您可能需要最后一个{then: false}子模式"切换",如果没有它,如果"键入"财产既不是' X'也不是' Y'验证将成功。

此外,您可以使用{pattern: '^X$'}甚至{enum: ['X']}而不是使用{constant: 'X'}(在草案06中,它是" const");而不是使用开关,你可以使用" if / then / else" (来自ajv-keywords,它可能会被包含在草案-07)中,甚至可以包含在#34; select"中,这可能更适合这种情况。

也许你可以澄清最后一个问题,我不认为我理解。