JSON 架构 oneOf 不适用于引用
JSON Schema oneOf doesn't work with references
架构适用于具有 header 属性的消息,然后是 msg1
或 msg2
:
的属性
{
"$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"}],
架构适用于具有 header 属性的消息,然后是 msg1
或 msg2
:
{
"$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"}],