关于gojsonschema的技术问询:#/definitions释义与字段唯一性校验
问题1:#/definitions/是什么?它的作用是什么?
在JSON Schema里,definitions是一个标准关键字,专门用来存放可复用的schema片段,相当于一个“代码片段仓库”。
假设你在schema里需要多次用到同一个结构(比如用户信息、商品规格),总重复写相同的字段规则不仅麻烦,后期修改也容易漏改。这时候就可以把这个重复结构放到definitions里定义一次,之后在需要的地方用$ref关键字引用它就行。
举个实际例子:
{ "definitions": { "User": { "type": "object", "properties": { "id": {"type": "integer"}, "name": {"type": "string"} }, "required": ["id", "name"] } }, "type": "object", "properties": { "owner": {"$ref": "#/definitions/User"}, "teamMembers": { "type": "array", "items": {"$ref": "#/definitions/User"} } } }
这里#/definitions/User就是引用我们在definitions里定义的用户结构,不管是单个owner还是teamMembers数组里的成员,都会遵循同一个规则。之后如果要给用户加个email字段,只需要修改definitions里的User,所有引用的地方都会自动同步。
问题2:如何实现name字段的required、pattern和唯一验证?
我们分三个规则来逐步实现:
1. 基础规则(必填 + 格式校验)
这部分用JSON Schema的标准关键字就能搞定:
required: true:把name字段加入所在对象的required数组,确保它必须存在pattern: /^[A-Za-z0-9_\-\.]+$/:在name的schema里添加pattern关键字,注意JSON里正则不需要加首尾斜杠,特殊字符(比如-)要转义成\-
示例代码:
{ "type": "object", "properties": { "name": { "type": "string", "pattern": "^[A-Za-z0-9_\\-\\.]+$" } }, "required": ["name"] }
2. 唯一值验证(所有name字段不重复)
这里默认你是指数组中每个元素(每个元素都是带name的对象)的name值必须唯一,这是最常见的场景。JSON Schema本身没有直接的unique关键字,但可以用$data关键字(gojsonschema支持JSON Schema Draft 7及以上,而$data是这个版本的标准特性)结合uniqueItems实现:
核心思路是:生成一个由所有name值组成的虚拟数组,然后验证这个数组的uniqueItems为true(即所有元素无重复)。
完整示例:
{ "type": "object", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "pattern": "^[A-Za-z0-9_\\-\\.]+$" } }, "required": ["name"] }, "allOf": [ { "$comment": "确保所有name值唯一", "properties": { "nameCollection": { "$data": "0/*/name", // 引用数组中每个元素的name字段,生成一个name数组 "uniqueItems": true // 验证这个数组的所有元素无重复 } }, "required": ["nameCollection"] } ] } }, "required": ["items"] }
特殊场景说明:
- 如果你的“其他name字段”不是指数组元素,而是同一个对象下的多个子对象(比如
{"obj1": {"name": "a"}, "obj2": {"name": "b"}}),可以用$data引用多个子对象的name路径生成数组,再用uniqueItems验证。 - 如果你用的是更早的JSON Schema版本(比如Draft 4),
$data不被支持,这时候可以用gojsonschema的自定义验证器:注册一个验证函数,遍历所有name值手动检查是否重复。
内容的提问来源于stack exchange,提问作者07_05_GuyT
相关产品推荐
相关产品推荐

