JSON Schema V4枚举定义及缺失字段校验问题求助
解决fge JSON Schema校验器未校验缺失字段的问题
你遇到的核心问题其实是JSON Schema的默认行为导致的,再结合fge校验库的使用细节,咱们一步步来排查解决:
1. 先确认Schema的required关键字配置
JSON Schema V4里,只有当字段被加入到required数组中时,校验器才会强制检查该字段是否存在。如果你的sourceType是业务上必须存在的字段,但Schema里没把它标记为必填,那当JSON请求缺少这个字段时,校验器会直接跳过对它的所有校验(包括你定义的枚举规则)。
你需要在主Schema里补充required配置,把sourceType包含进去,示例如下:
{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "xxxxxxxxxxxxxxxxxxxxxxx", "description": "xxx...", "type": "object", "required": ["sourceType"], // 新增这行,标记sourceType为必填字段 "properties": { "sourceType": { "type": "string", "enum": ["TYPE_X", "TYPE_Y", "TYPE_Z"] // 你的枚举定义 } // 其他属性定义... } }
配置完成后,当JSON请求不含sourceType时,校验器会直接返回“缺少必填字段sourceType”的错误,符合预期。
2. 确保fge校验器的代码使用正确
如果Schema已经配置了required但还是没生效,那可能是校验代码的问题。下面是一个标准的fge校验代码示例,你可以对照检查自己的实现:
import com.github.fge.jsonschema.core.report.ProcessingReport; import com.github.fge.jsonschema.main.JsonSchema; import com.github.fge.jsonschema.main.JsonSchemaFactory; import org.json.JSONObject; import java.nio.file.Files; import java.nio.file.Paths; public class JsonSchemaValidator { public static void main(String[] args) throws Exception { // 从文件加载Schema(也可以直接用字符串构建) String schemaContent = new String(Files.readAllBytes(Paths.get("your-schema-file.json"))); JSONObject schemaJson = new JSONObject(schemaContent); // 创建默认的Schema工厂和Schema实例 JsonSchemaFactory factory = JsonSchemaFactory.byDefault(); JsonSchema schema = factory.getJsonSchema(schemaJson); // 待校验的JSON实例(不含sourceType) String jsonContent = "{\"otherField\": \"test-content\"}"; JSONObject jsonInstance = new JSONObject(jsonContent); // 执行校验(默认会检查所有规则,包括必填字段) ProcessingReport report = schema.validate(jsonInstance); // 处理校验结果 if (!report.isSuccess()) { System.out.println("校验失败详情:"); report.forEach(msg -> System.out.println("- " + msg.getMessage())); } else { System.out.println("校验通过"); } } }
3. 检查fge库的版本兼容性
确保你使用的fge jsonschema库版本是支持Draft V4的,推荐使用稳定版2.2.6,这个版本对Draft V4的规则支持非常完善,能避免因版本过低导致的兼容性问题。
如果sourceType不是业务必填字段,只是希望它存在时才校验枚举规则,那你的现有Schema是符合规范的——因为当字段不存在时,枚举规则本就不会触发,这是JSON Schema的设计逻辑。这种情况下,若要对缺失字段做提示,只能结合业务逻辑额外处理,或者用dependencies等关键字做进阶约束。
内容的提问来源于stack exchange,提问作者Siva Koti
相关产品推荐
相关产品推荐

