我正在尝试为消息传递系统创建JSON模式。我目前设置了以下schema:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Message",
"description": "Just your average message",
"type": "object",
"properties": {
"header": {
"type": "object",
"properties": {
"messageType": {
"type": "string",
"minLength": 1,
"enum": [
"message1",
"message2"
]
},
"sender": {
"type": "string",
"minLength": 1
}
},
"required": [
"messageType",
"sender"
]
},
"body": {}
},
"required": [
"header",
"body"
]
}
这对于header部分非常有效,但是我想扩展这个验证,让主体具有基于“header -> messageType”值的某些必需字段。如果“messageType”是“message 1”,则“body”需要“prop 1”字段。如果“messageType”是“message 2”,则“body”需要“prop 2”的值。比如...
{
"header": {
"sender": "John Doe",
"type": "message1"
},
"body": {
"prop1": "Hello"
}
}
...是一个有效的对象,但是...
{
"header": {
"sender": "John Doe",
"type": "message1"
},
"body": {}
}
不会我试着阅读了关于如何使用“allOf”和if-else条件来实现这一点的文档,但是我发现没有任何东西可以用来引用主体范围之外的字段。如果有人对此有任何见解,我将不胜感激。使用定义的好处是,我最终计划扩展它,从不同的模式文件中提取“主体”结构。
编辑:添加了更多信息,说明根据消息类型需要哪些字段。
1条答案
按热度按时间ua4mk5z41#
您可以在Draft-07或更新版本中使用
if, then
语法来实现此行为。诀窍是在最顶层使用条件语法,并在条件语句中向下钻取模式。然后,您可以将目标模式定位到需要约束的地方。