使用 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,这可能更适合这种情况。
也许你可以澄清最后一个问题,我想我没明白。
我正在尝试验证 "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,这可能更适合这种情况。
也许你可以澄清最后一个问题,我想我没明白。