如何为JSON Schema固定属性集高效应用相同配置?
解决方案
针对你的需求,有两种更高效的方式来统一配置这些setting_*属性的类型:
方法一:使用patternProperties匹配命名规则
利用patternProperties可以匹配符合特定正则表达式的属性名,一次性给所有匹配的属性应用相同的Schema规则,同时保留additionalProperties: false来禁止未定义的属性。修改后的Schema如下:
{ "$id": "<some id here>", "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "additionalProperties": false, "properties": { "settings": { "type": "object", "additionalProperties": false, // 匹配所有以setting_开头的属性名,可根据实际命名规则调整正则 "patternProperties": { "^setting_\\d+$": { "type": "string" } }, "required": [ "setting_1", "setting_2", "setting_3" // 其他需要必填的setting属性继续添加 ] } }, "required": [ "settings" ] }
^setting_\\d+$是正则表达式,匹配所有setting_后跟数字的属性名,若你的属性后缀不是数字,可改成^setting_.+$匹配任意后缀。- 不管新增多少个
setting_*属性,只要命名符合规则,都会自动应用type: string的约束,无需逐个在properties中定义。
方法二:结合$defs与additionalProperties(动态属性场景)
如果settings对象只允许setting_*类属性,且不需要逐个指定必填项(或所有setting_*都是可选),可以用propertyNames限制属性名格式,再通过additionalProperties引用统一规则:
{ "$id": "<some id here>", "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "additionalProperties": false, "$defs": { "stringSetting": { "type": "string" } }, "properties": { "settings": { "type": "object", // 限制属性名必须符合setting_*格式 "propertyNames": { "pattern": "^setting_\\d+$" }, // 所有符合命名规则的属性都应用统一的字符串规则 "additionalProperties": {"$ref": "#/$defs/stringSetting"} } }, "required": [ "settings" ] }
这种方式适合无需指定具体必填属性的场景,所有符合命名规则的属性都会被自动校验为字符串类型。
内容的提问来源于stack exchange,提问作者Shod
相关产品推荐
相关产品推荐

