含公共属性且部分属性差异的对象JSON Schema写法是否正确?
结论
你的Schema写法不正确,既存在基础语法错误,也没有实现「公共属性复用+差异化属性扩展」的设计目标。
存在的具体问题
- 结构层级错误:
"type": "object"和"properties"节点被错误放在和definitions平级的位置,缺少根Schema对象包裹,不符合JSON Schema的基本结构要求。 - 公共属性定义错误:
media-content下的title、related-media业务属性没有放在properties节点内,直接和type平级会被识别为Schema元配置字段,不会生效为业务属性校验规则。 - 字段类型声明错误:
type字段的定义里用"format": "string"声明类型是语法错误,format是用于补充格式约束(如uri、email)的关键字,声明基础类型必须用"type": "string"。 - 复用逻辑错误:当前写法把
media-content作为category字段的类型引用,并没有实现「多个对象共享公共属性、同时持有差异化属性」的继承效果。
正确实现参考
如果你的需求是让不同类型的媒体对象(音频、视频等)复用media-content的公共属性,同时各自扩展独有属性,应该用allOf做Schema组合、oneOf做类型分流,示例代码如下:
{ "$schema": "http://json-schema.org/draft-07/schema#", "definitions": { "media-content": { "type": "object", "properties": { "title": { "type": "string" }, "related-media": { "type": "object", "additionalProperties": { "type": "string" } } }, "required": ["title"] } }, "oneOf": [ { // 视频类型:继承公共属性 + 独有属性 "allOf": [ { "$ref": "#/definitions/media-content" }, { "type": "object", "properties": { "type": { "type": "string", "const": "video" }, "format": { "type": "string", "enum": ["mp4", "mov", "mkv"] } } } ] }, { // 音频类型:继承公共属性 + 独有属性 "allOf": [ { "$ref": "#/definitions/media-content" }, { "type": "object", "properties": { "type": { "type": "string", "const": "audio" }, "bitrate": { "type": "number" } } } ] } ] }
如果你的业务逻辑确实是category字段的值为media-content类型对象,只需要修正前3个语法错误即可,不需要用组合继承的写法。
内容的提问来源于stack exchange,提问作者BreenDeen
相关产品推荐
相关产品推荐

