JSON 用于验证具有不同可能字段值的列表的架构
JSON schema for validating list with different possible field values
在 JSON 结构(“事件包”)中,我正在收集多个事件列表。这些称为事件列表。该列表中的每个事件至少有一个 type
字段,其值取决于它存储在哪个列表中。考虑以下有效示例:
{
"event_bundle": {
"alert_events": [
{ "type": "fooAlert1", "value": "bar" },
{ "type": "fooAlert2", "value": "bar" },
{ "type": "fooAlert3", "value": "bar" }
],
"user_events": [
{ "type": "fooUser1", "value": "bar" },
{ "type": "fooUser2", "value": "bar" },
{ "type": "fooUser3", "value": "bar" }
]
}
}
这里,alert_events
只能包含fooAlert1
、fooAlert2
和fooAlert3
类型的事件,不能包含其他类型的事件。 user_events
也是如此。所以,这个 JSON 不是 是有效的:
{
"event_bundle": {
"alert_events": [
{ "type": "fooAlert1", "value": "bar" },
{ "type": "fooUser2", "value": "bar" },
{ "type": "foo", "value": "bar" }
],
"user_events": [
{ "type": "fooAlert1", "value": "bar" },
{ "type": "fooUser2", "value": "bar" },
{ "type": "foo", "value": "bar" }
]
}
}
无效,因为 fooUser2
不能出现在 alert_events
列表中的事件中,并且 fooAlert1
不能出现在 user_events
中。此外,事件 foo
根本无效。
我目前有以下简单架构:
{
"type": "object",
"definitions": {
"event_list": {
"type": "array",
"items": {
"$ref": "#/definitions/event"
}
},
"event": {
"type": "object",
"required": ["type", "value"],
"properties": {
"type": { "type": "string" },
"value": { "type": ["string", "object"] },
"source": { "type": ["string", "null"] }
}
}
},
"properties": {
"event_bundle": {
"type": "object",
"properties": {
"alert_events": {
"$ref": "#/definitions/event_list"
},
"user_events": {
"$ref": "#/definitions/event_list"
}
}
}
}
}
然而,这并没有完全验证允许的 type
s。
我知道我可以用不同的 event
定义不同的 event_list
,但这意味着我可能必须定义几十个列表和事件。
有没有更简单的说法,我想验证 alert_events
列表中的 event
个对象可以有一组 type
,而对于另一个列表,另一组类型?
您不能在验证中引用和使用实例数据作为值。
您要问的是业务逻辑,与 JSON 数据的 "shape" 无关,这是 JSON 模式的职责范围。
您需要将此实现为您的应用程序逻辑。
在 JSON 结构(“事件包”)中,我正在收集多个事件列表。这些称为事件列表。该列表中的每个事件至少有一个 type
字段,其值取决于它存储在哪个列表中。考虑以下有效示例:
{
"event_bundle": {
"alert_events": [
{ "type": "fooAlert1", "value": "bar" },
{ "type": "fooAlert2", "value": "bar" },
{ "type": "fooAlert3", "value": "bar" }
],
"user_events": [
{ "type": "fooUser1", "value": "bar" },
{ "type": "fooUser2", "value": "bar" },
{ "type": "fooUser3", "value": "bar" }
]
}
}
这里,alert_events
只能包含fooAlert1
、fooAlert2
和fooAlert3
类型的事件,不能包含其他类型的事件。 user_events
也是如此。所以,这个 JSON 不是 是有效的:
{
"event_bundle": {
"alert_events": [
{ "type": "fooAlert1", "value": "bar" },
{ "type": "fooUser2", "value": "bar" },
{ "type": "foo", "value": "bar" }
],
"user_events": [
{ "type": "fooAlert1", "value": "bar" },
{ "type": "fooUser2", "value": "bar" },
{ "type": "foo", "value": "bar" }
]
}
}
无效,因为 fooUser2
不能出现在 alert_events
列表中的事件中,并且 fooAlert1
不能出现在 user_events
中。此外,事件 foo
根本无效。
我目前有以下简单架构:
{
"type": "object",
"definitions": {
"event_list": {
"type": "array",
"items": {
"$ref": "#/definitions/event"
}
},
"event": {
"type": "object",
"required": ["type", "value"],
"properties": {
"type": { "type": "string" },
"value": { "type": ["string", "object"] },
"source": { "type": ["string", "null"] }
}
}
},
"properties": {
"event_bundle": {
"type": "object",
"properties": {
"alert_events": {
"$ref": "#/definitions/event_list"
},
"user_events": {
"$ref": "#/definitions/event_list"
}
}
}
}
}
然而,这并没有完全验证允许的 type
s。
我知道我可以用不同的 event
定义不同的 event_list
,但这意味着我可能必须定义几十个列表和事件。
有没有更简单的说法,我想验证 alert_events
列表中的 event
个对象可以有一组 type
,而对于另一个列表,另一组类型?
您不能在验证中引用和使用实例数据作为值。
您要问的是业务逻辑,与 JSON 数据的 "shape" 无关,这是 JSON 模式的职责范围。
您需要将此实现为您的应用程序逻辑。