如何为JSON Schema draft-07基于内网子页面JSON属性创建枚举?
JSON Schema Draft-07 动态枚举引用问题解答
先纠正你的第一个示例错误
你当前的写法没法实现预期效果,问题出在两点:
$ref只能用来引用其他JSON Schema定义,不能直接拉取普通JSON数据里的属性值当枚举用。const要求值是固定字面量,嵌套$ref完全不符合Schema语法规范。
假设你的 teams.json 是这样的普通JSON数据:
[ {"slug": "frontend", "name": "前端团队"}, {"slug": "backend", "name": "后端团队"} ]
要让teams数组的元素只能是这些slug值,你没法直接通过$ref动态引用,必须把这些值预提取出来,写成enum数组:
"teams": { "description": "An array of teams in the inventory", "type": "array", "items": { "type": "string", "enum": ["frontend", "backend"] } }
如果不想手动维护,可以写个脚本定时拉取内网JSON数据,自动生成这个enum数组嵌入Schema。
关于多子页面的引用问题
你想通过"$ref": "https://mycompany.com/inventory/teams.json/*/#/slug"这种通配符写法引用所有子页面的slug,完全不可行,原因有两个:
- JSON Schema的
$ref不支持通配符匹配多个URL,只能指向明确的单个Schema资源。 - 核心问题还是一样:即使能定位到子页面的JSON数据,Draft-07也没有原生能力从外部数据中动态提取值生成枚举。
可行的替代方案
- 批量预提取+脚本生成:写脚本遍历所有子页面的URL,拉取每个页面的JSON数据,提取所有
slug值合并成一个数组,再写入Schema的enum中。 - 升级Schema版本:如果可以升级到JSON Schema Draft 2020-12,结合
$dynamicRef和自定义工具链,能实现更灵活的动态引用,但依然需要工具支持,原生Schema校验器本身不会主动拉取外部数据生成枚举。
内容的提问来源于stack exchange,提问作者pinkfloydfan
相关产品推荐
相关产品推荐

