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只能包含fooAlert1fooAlert2fooAlert3类型的事件,不能包含其他类型的事件。 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"
        }
      }
    }
  }
}

然而,这并没有完全验证允许的 types。

我知道我可以用不同的 event 定义不同的 event_list,但这意味着我可能必须定义几十个列表和事件。

有没有更简单的说法,我想验证 alert_events 列表中的 event 个对象可以有一组 type,而对于另一个列表,另一组类型?

您不能在验证中引用和使用实例数据作为值。

您要问的是业务逻辑,与 JSON 数据的 "shape" 无关,这是 JSON 模式的职责范围。

您需要将此实现为您的应用程序逻辑。