使用com.networknt的json-schema-validator报No suitable validator for id如何解决
问题原因与修复方案
1. 报错直接原因
你使用的json-schema-validator库针对JSON Schema 2019-09规范,将id识别为普通校验关键字而非Schema标识字段,找不到对应的校验逻辑所以抛出异常。
JSON Schema从Draft 08(也就是2019-09版本)开始,Schema的唯一标识字段已从id调整为$id,你当前Schema里的id字段不符合你指定的V201909版本规范。
2. 报错修复方法
二选一即可:
- 方式1(推荐):修改Schema定义,把
"id" : "urn:jsonschema:x:x:x:x:x:x:x:x:Class_name"改为"$id" : "urn:jsonschema:x:x:x:x:x:x:x:x:Class_name",符合2019-09版本规范 - 方式2:若要保留原有
id写法,将初始化Schema工厂的版本标记改为旧版本,比如VersionFlag.V7(Draft 07及更早版本用id作为Schema标识字段)
3. 收集所有错误字段的实现
你当前使用的schema.validate(node)方法本身默认就会返回所有校验不通过的结果,不会提前终止,你只需遍历返回的Set<ValidationMessage>,提取每个对象的getPath()(错误字段路径)、getMessage()(错误描述)字段,即可整理出所有错误字段的列表。
如果校验时默认只返回第一个错误,可以在构造Schema工厂时传入配置关闭快速失败:
JsonSchemaFactory factory = JsonSchemaFactory.builder(JsonSchemaFactory.getInstance(VersionFlag.V201909)) .addConfigurations(config -> config.setFailFast(false)) .build();
4. JSON键合法性校验方案
如果需要校验输入JSON的所有键是否符合预期(禁止出现未定义的键),可以在Schema顶层添加"additionalProperties": false配置:
{ "type" : "object", "$id" : "urn:jsonschema:x:x:x:x:x:x:x:x:Class_name", "properties" : { // 你定义的合法字段 }, "additionalProperties": false }
开启后输入JSON出现Schema未定义的键时,会触发校验错误,你可以从结果中拿到所有非法的键名。如果需要支持符合特定正则规则的动态键,可以搭配patternProperties配置实现。
内容的提问来源于stack exchange,提问作者Disteonne
相关产品推荐
相关产品推荐

