如何在JSON Schema中实现alias属性默认值引用name属性取值
JSON Schema原生规范不支持动态默认值引用
JSON Schema当前最新的2020-12官方标准中,default关键字仅支持设置静态字面量,没有原生语法可以直接将一个属性的默认值动态绑定到另一个属性的取值。
可行的变通实现方案
你可以根据使用场景选择以下两种通用方案:
- 方案1:在数据校验/业务处理层实现逻辑
这是兼容性最高的实现方式,和JSON Schema规范完全解耦,只需要在数据生效、入库前加一层简单处理逻辑即可:如果alias字段未传值或者为空,就直接把name字段的取值赋值给alias,示例伪代码如下:
// 示例JS处理逻辑 if (!data.alias) { data.alias = data.name }
- 方案2:使用支持扩展能力的JSON Schema校验库实现
部分第三方JSON Schema校验库(比如前端常用的Ajv)支持自定义关键字扩展,你可以自定义一个defaultRef类的关键字,配置对应引用路径,在校验阶段自动完成动态赋值。以Ajv为例的自定义逻辑示意:
ajv.addKeyword({ keyword: 'defaultRef', modifying: true, valid: true, compile: (schema) => (data, dataCtx) => { if (data === undefined) { // 按引用路径取对应字段值赋值 dataCtx.parentData[dataCtx.parentDataProperty] = dataCtx.rootData.name } return true } })
此时你的alias属性可以调整为如下配置:
"alias": { "$id": "#/properties/alias", "type": "string", "title": "Alias", "description": "用户在网络中设置的自定义名称即别名。", "defaultRef": "#/properties/name", "examples": [ "Updated-Name111" ] }
注意:该扩展方案仅适配对应第三方库,不具备跨校验实现的通用性,如果你的Schema需要在不同工具中通用,优先选择第一种方案。
内容的提问来源于stack exchange,提问作者user14576370
相关产品推荐
相关产品推荐

