1

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

我的 JSON:

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

在此示例中,类型 = 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 关键字来验证数组的对象,其中每个对象类型都由对象中的属性指定,因此可以使用属性来标识对象类型。

4

1 回答 1

1

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

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

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

于 2017-03-05T10:27:49.033 回答