使用 Ajv 验证 JSON 数组中的对象

Validate objects in JSON array with Ajv

我正在尝试验证 "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 关键字来验证数组的对象,其中每个对象类型由对象中的 属性 指定,因此对象类型可以用 [= 标识25=].

您的架构看起来几乎没问题,您可能需要 "switch" 中的最后一个 {then: false} 子架构,因为没有它,如果 "type" 属性 既不是 'X' 也不 'Y' 验证将成功。

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

也许你可以澄清最后一个问题,我想我没明白。