具有嵌套属性的JSON架构,该嵌套属性的存在取决于来自更高范围的另一个属性的值

4zcjmb1e  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(94)

我正在尝试为消息传递系统创建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条件来实现这一点的文档,但是我发现没有任何东西可以用来引用主体范围之外的字段。如果有人对此有任何见解,我将不胜感激。使用定义的好处是,我最终计划扩展它,从不同的模式文件中提取“主体”结构。
编辑:添加了更多信息,说明根据消息类型需要哪些字段。

ua4mk5z4

ua4mk5z41#

您可以在Draft-07或更新版本中使用if, then语法来实现此行为。诀窍是在最顶层使用条件语法,并在条件语句中向下钻取模式。然后,您可以将目标模式定位到需要约束的地方。

{
    "$schema": "http://json-schema.org/draft-07/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": {
            "properties": {
                "prop1": {
                    "type": "string"
                },
                "prop2": {
                    "type": "number"
                }
            }
        }
    },
    "required": [
        "header",
        "body"
    ],
    "allOf": [
        {
            "if": {
                "properties": {
                    "header": {
                        "properties": {
                            "messageType": {
                                "const": "message1"
                            }
                        }
                    }
                }
            },
            "then": {
                "properties": {
                    "body": {
                        "required": [
                            "prop1"
                        ]
                    }
                }
            }
        },
        {
            "if": {
                "properties": {
                    "header": {
                        "properties": {
                            "messageType": {
                                "const": "message2"
                            }
                        }
                    }
                }
            },
            "then": {
                "properties": {
                    "body": {
                        "required": [
                            "prop2"
                        ]
                    }
                }
            }
        }
    ]
}

相关问题