JSON 架构 oneOf 不适用于引用

JSON Schema oneOf doesn't work with references

架构适用于具有 header 属性的消息,然后是 msg1msg2:

的属性
{
    "$schema": "http://json-schema.org/draft-04/schema#",

    "definitions": {
        "header": {
            "type": "object",
            "properties": {
                "token":         { "type": "string" },
                "id":            { "type": "number" }
            },
            "required": ["token", "id"]
        },
        "msg1": {
            "type": "object",
            "properties": {
                "content1":         { "type": "string" }
            },
            "required": ["content1"]
        },
        "msg2": {
            "type": "object",
            "properties": {
                "content2":         { "type": "string" }
            },
            "required": ["content2"]
        }
    },

    "type": "object",
    "$ref": "#/definitions/header",
    "oneOf": [
       {"$ref": "#/definitions/msg1" },
       {"$ref": "#/definitions/msg2" }
    ]
}

所以这应该通过:

{
    "token": "abc123",
    "id": 333,
    "content1": "s"
}

问题是以下通过:

{
    "token": "abc123",
    "id": 333
}

如何解决?

(当然,msg#的数量更多,结构也不同)

$ref 之外的所有内容都将被忽略。

Any members other than "$ref" in a JSON Reference object SHALL be ignored.

您可以通过将 $ref 包装在 allOf 中来解决问题。

"allOf": [{"$ref": "#/definitions/header"}],