如何扩展JSON基础Schema,自动为各子Schema添加公共属性?
解决JSON Schema通用属性复用与字段冲突问题
核心方案
把通用属性(比如isDisabled)抽离到基础Schema的基类中,让所有业务任务类型都继承这个基类,既避免重复定义,又解决同名字段冲突。
分步实现
1. 编写基础Schema
新建一个基础任务Schema(比如base-task.schema.json),把所有任务通用的属性都放在这里:
{ "name": "baseTask", "uri": "http://some-company/schema/bpmn/base", "$schema": "http://json-schema.org/draft-07/schema", "description": "所有任务的通用属性集合", "prefix": "base", "xml": { "tagAlias": "lowerCase" }, "types": [ { "name": "BaseTask", "extends": ["bpmn:Task"], "properties": [ { "name": "isDisabled", "isAttr": false, "description": "标记该任务是否禁用", "type": "Boolean" }, { "name": "taskName", "description": "任务名称", "isAttr": true, "type": "String" } // 后续新增的通用属性都往这里加 ] } ], "enumerations": [], "associations": [] }
2. 业务Schema继承基类
修改你的语音任务Schema,让业务类型继承基础的BaseTask,而不是直接继承bpmn:Task,这样就能自动拿到所有通用属性,不用再重复定义:
{ "name": "interactiveVoice", "uri": "http://some-company/schema/bpmn/ivr", "$schema": "http://json-schema.org/draft-07/schema", "description": "语音播放任务专属属性", "prefix": "voice", "xml": { "tagAlias": "lowerCase" }, "types": [ { "name": "voiceFilePlayerTask", "extends": ["base:BaseTask"], // 替换成继承基础基类 "properties": [ { "name": "taskType", "description": "任务类型标识", "isAttr": true, "type": "String" } // 只保留业务独有的属性即可 ] } ], "enumerations": [], "associations": [] }
3. 适配XML验证与渲染
因为你是基于XML流程渲染并验证Schema,需要注意两点:
- 确保XML命名空间中正确引入基础Schema的
uri - 确认你的XML解析工具支持Schema类型继承,能自动将基类的属性合并到业务类型对应的XML元素中
冲突解决原理
之前的同名字段冲突,是因为你在多个独立Schema中重复定义了isDisabled,导致Schema合并时出现重复声明。通过继承基类的方式,通用属性只在基础Schema中定义一次,所有业务类型通过继承复用,既不会重复定义,还能统一使用isDisabled这个通用字段,不用再给字段加任务类型后缀。
内容的提问来源于stack exchange,提问作者Shaan Srivastava
相关产品推荐
相关产品推荐

