如何为JSON Schema中所有string类型字段添加全局pattern验证(Ajv)
解决Ajv全局验证所有string类型属性的问题
你之前的写法有两个关键问题:
- 关键字拼写错误:
allof应该是驼峰式的allOf; - 规则应用对象错误:
pattern是针对string类型的验证关键字,你直接在object类型的allOf里添加该规则,Ajv会忽略这种不匹配类型的验证逻辑,自然不会生效。
正确实现方式
要给所有string类型的属性(包括已定义和未定义的额外属性)添加全局特殊字符验证,推荐用patternProperties结合if/then的方案,能覆盖所有属性场景:
{ "type": "object", // 这里定义你的对象属性(示例) "properties": { "username": { "type": "string" }, "description": { "type": "string" }, "age": { "type": "integer" } }, // 允许额外属性(不需要的话可以设为false) "additionalProperties": true, "allOf": [ { "patternProperties": { // 匹配所有属性名 ".*": { // 判断属性值是否为string类型 "if": { "type": "string" }, // 符合条件则应用正则验证(禁止<>%${}[]这些特殊字符) "then": { "pattern": "^[^<>%${}\\[\\]]*$" } } } } ] }
补充说明
- 正则写法:
^[^<>%${}\\[\\]]*$里的^(字符集开头)表示取反,即整个字符串不能包含<>%${}[]这些特殊字符,注意对[、]、$等正则特殊字符做转义; - 如果你的属性都是预先定义好的,也可以把string规则抽成复用片段,更简洁:
{ "type": "object", "$defs": { "safeString": { "type": "string", "pattern": "^[^<>%${}\\[\\]]*$" } }, "properties": { "username": { "$ref": "#/$defs/safeString" }, "description": { "$ref": "#/$defs/safeString" }, "age": { "type": "integer" } }, // 额外属性也应用该规则(如果允许额外属性为非string类型,就不要用这个) "additionalProperties": { "$ref": "#/$defs/safeString" } }
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

