JSON Schema Draft-06中如何排除name为status-ranges的原setting类型?
解决方案:用
not关键字实现特定name的Schema特化 嘿,我来帮你搞定这个JSON Schema的特化需求!你想要实现的是当name字段为"status-ranges"时,跳过原setting类型的约束,改用自定义的子集规则,核心就是用好JSON Schema Draft-06里的not关键字,配合条件分支来实现。
核心思路
我们需要把setting类型拆分为两个互斥的场景:
- 当
name等于"status-ranges"时,使用你自定义的特化约束(完全绕过原setting的规则) - 当
name不等于"status-ranges"时,严格沿用原setting的约束
这里not关键字的作用是否定一个子Schema的匹配结果,我们可以用它来精准排除name为"status-ranges"的情况,确保原规则只对其他name生效。
完整的特化Schema示例
注意:你原Schema里setting的required字段写了["type","data"],但properties里并没有type字段,这应该是笔误,我改成了["name","data"],如果实际需求不同请自行调整。
{ "settingData": { "$id": "#settingData", "oneOf": [ { "type": "number" }, { "type": "array", "items": { "oneOf": [{ "type": "number" }, { "type": "null" }] } }, { "type": "array", "items": { "$ref": "#setting" } } ] }, "setting": { "$id": "#setting", "type": "object", "required": ["name", "data"], "oneOf": [ // 场景1:name为"status-ranges",使用特化规则 { "properties": { "name": { "const": "status-ranges" }, "data": { // 这里写你需要的子集约束,比如只允许数字数组 "type": "array", "items": { "type": "number" } } } }, // 场景2:name不为"status-ranges",沿用原setting规则 { "allOf": [ { "properties": { "name": { "type": "string", "title": "type of setting", "examples": ["led-brightness"] }, "data": { "$ref": "#settingData" } } }, // 用not排除name为"status-ranges"的情况 { "not": { "properties": { "name": { "const": "status-ranges" } }, "required": ["name"] } } ] } ] } }
关键部分解释
const关键字:精准匹配name为"status-ranges"的情况,比正则更简洁可靠oneOf分支:确保两个场景互斥,一个对象只能匹配其中一个分支not的用法:在场景2中,not会排除所有name等于"status-ranges"的对象,彻底让原规则对这个name失效- 特化约束:你可以在场景1的
data字段里任意定义子集规则,比如只允许数字数组、特定范围的数字等,完全不受原settingData的限制
另一种写法:用if/then/else
如果你更喜欢条件判断的风格,也可以用if/then/else来实现,逻辑是一样的:
"setting": { "$id": "#setting", "type": "object", "required": ["name", "data"], "if": { "properties": { "name": { "const": "status-ranges" } }, "required": ["name"] }, "then": { // 特化规则 "properties": { "data": { "type": "array", "items": { "type": "number" } } } }, "else": { "allOf": [ { "properties": { "name": { "type": "string", "title": "type of setting", "examples": ["led-brightness"] }, "data": { "$ref": "#settingData" } } }, { "not": { "properties": { "name": { "const": "status-ranges" } }, "required": ["name"] } } ] } }
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

