如何强制数组内的对象键名?YAML+JSON Schema场景技术求助
如何在JSON Schema中约束YAML公式数组嵌套对象的键名
我明白你的痛点:已经搞定了公式根节点直接子对象的键名与类型约束,但数组里的嵌套运算对象(比如示例add数组里的subtract),目前只能保证类型正确,没法限制它的键名范围。下面给你具体的解决思路和可直接用的示例:
核心思路
要约束数组中的嵌套对象,核心是递归复用根节点的约束逻辑——因为数组里的每一项,要么是纯数值,要么是和根节点结构完全一致的运算对象(可以是add/subtract这类合法键名的对象)。同时配合additionalProperties: false来禁止非法键名。
完整JSON Schema示例
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "formula": { "oneOf": [ // 允许纯数值 { "type": "number" }, // 允许运算对象(add/subtract二选一) { "type": "object", "oneOf": [ { "type": "object", "required": ["add"], "properties": { "add": { "type": "array", // 数组每一项都遵循formula的约束(递归) "items": { "$ref": "#/properties/formula" } } }, // 禁止出现add以外的其他键名 "additionalProperties": false }, { "type": "object", "required": ["subtract"], "properties": { "subtract": { "type": "array", "items": { "$ref": "#/properties/formula" } } }, "additionalProperties": false } ] } ] } }, "required": ["formula"] }
关键细节拆解
- 递归引用:
"$ref": "#/properties/formula"让数组的每一项都继承根节点formula的约束,不管嵌套多少层(比如add里套subtract再套add),都能保持一致的规则。 additionalProperties: false:这是限制键名的核心!它会直接拒绝对象中出现Schema未定义的键名,比如如果有人写multiply: [2,3],验证会直接失败。- 层级一致性:不管是根节点的运算对象,还是数组里的嵌套运算对象,都只能在
add/subtract里二选一,完全符合你要的键名约束需求。
验证你的示例YAML
你的示例代码:
formula: # 等价于 '5 + (3 - 2)' add: - 5 - subtract: [3, 2]
用上面的Schema验证会完全通过:
- 根节点
formula是合法的add对象; add数组第一项是纯数值,符合约束;- 第二项是合法的
subtract对象,且没有多余键名。
内容的提问来源于stack exchange,提问作者Toby
相关产品推荐
相关产品推荐

