JSON Schema 2020-12版本if-then条件验证异常排查
解决方案
1. 修正子Schema(test.json)的规则定义
最常见的问题是全局required数组错误包含了referenceval,导致无论tableName取值如何,该字段都会被强制要求必填。正确的做法是仅在对应if-then的then块中声明字段必填,全局仅保留tableName为必填项:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "tableName": { "type": "string", "enum": ["TABLE1", "TABLE2"] }, "referenceval": { "type": "string" }, "code": { "type": "string" } }, "required": ["tableName"], "allOf": [ { "if": { "properties": { "tableName": { "const": "TABLE1" } }, "required": ["tableName"] }, "then": { "required": ["referenceval"] } }, { "if": { "properties": { "tableName": { "const": "TABLE2" } }, "required": ["tableName"] }, "then": { "required": ["code"] } } ] }
2. 确保主Schema(cache_test.json)的引用路径与代码配置一致
主Schema中$ref的路径必须和代码中schemas集合的key完全匹配:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$ref": "https://json-schema.org/schema/test.json" }
3. 优化代码中Schema的加载逻辑
当前代码将子Schema序列化后转为字符串存入集合,可简化为直接加载JsonNode对象,避免序列化/反序列化可能导致的格式丢失:
// 替换原有的子Schema加载逻辑 JsonNode jsonNodeSubSchema = mapperSubSchema.readValue(subSchemaStream, JsonNode.class); JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012, builder -> builder.schemaLoaders(schemaLoaders -> schemaLoaders.schemas( Collections.singletonMap("https://json-schema.org/schema/test.json", jsonNodeSubSchema))));
4. 验证依赖库版本
确保使用的com.networknt:json-schema-validator为最新稳定版本,旧版本可能存在JSON Schema 2020-12规范的兼容性bug。
测试验证
用以下用例验证效果:
- 当
tableName: "TABLE1"且缺少referenceval:应提示referenceval必填 - 当
tableName: "TABLE2"且缺少referenceval:无该字段的错误提示,仅当缺少code时触发错误
内容的提问来源于stack exchange,提问作者javaseeker
相关产品推荐
相关产品推荐

