如何在JSON Schema中实现双可选属性的默认值与互斥校验?
需求可实现性说明
这个需求完全可以实现,具体通过「JSON Schema校验规则」+「数据默认值填充逻辑」结合完成,方案如下:
1. 用JSON Schema实现互斥校验(满足“两个字段同时存在返回错误”的要求)
修改原Schema,通过oneOf关键字限制输入只能符合以下三种情况之一:仅含expires_on_date、仅含expires_on_duration、两个字段都不含。修改后的Schema如下:
{ "type": "object", "required": ["foo"], "properties": { "foo": { "type": "string" }, "expires_on_date": { "type": "string", "format": "date-time" }, "expires_on_duration": { "type": "string", "format": "duration" } }, "oneOf": [ { "required": ["expires_on_date"] }, { "required": ["expires_on_duration"] }, { "not": { "anyOf": [ { "required": ["expires_on_date"] }, { "required": ["expires_on_duration"] } ] } } ] }
这个Schema的核心逻辑是:输入必须严格匹配oneOf中的某一条规则,一旦同时出现两个字段,就会触发校验失败,返回错误。
2. 实现默认值填充(满足“两个字段都缺失时自动设默认值”的要求)
JSON Schema本身的default关键字只是给工具的提示,不会主动修改输入数据,所以需要在Schema校验通过后,添加一段简单的逻辑:
- 若校验通过且输入中既没有
expires_on_date也没有expires_on_duration,则为expires_on_duration赋值"P2D" - 若输入中存在其中一个字段,则直接保留原字段值即可
3. 匹配示例场景验证
结合上述两步,完全覆盖所有输入输出场景:
- 输入
{"foo":"baz"}:校验通过,填充默认值后输出{"foo":"baz", "expires_on_duration": "P2D"} - 输入
{"foo":"baz", "expires_on_duration": "P4D"}:校验通过,直接保留原字段值输出 - 输入
{"foo":"baz", "expires_on_date": "2023-01-18T01:01:01"}:校验通过,直接保留原字段值输出 - 输入同时包含两个字段的JSON:Schema校验失败,返回
ERROR
内容的提问来源于stack exchange,提问作者monchyrcg
相关产品推荐
相关产品推荐

