JSON Schema属性名校验不生效,寻求解决思路
我之前处理JSON Schema验证的时候也踩过这个坑!其实问题出在大多数Java验证库默认是允许JSON里存在Schema没定义的额外属性的,所以你把id改成iddiff后,工具并不会主动触发你预期的“Unrecognized field”错误。下面给你针对几种常用Java库的具体解决指引:
解决JSON Schema未检测未知属性的问题
1. 针对Jackson相关验证工具(最常用场景)
如果你用的是Jackson生态的Schema验证,有两种方式可以解决:
方法一:修改JSON Schema添加约束
这是最贴合JSON Schema标准的做法,在你的对象Schema定义里添加"additionalProperties": false,明确禁止未知属性。比如你的Schema可以改成这样:
{ "type": "object", "properties": { "id": {"type": "integer"}, "name": {"type": "string"}, "price": {"type": "number"}, "tags": {"type": "array", "items": {"type": "string"}} }, "required": ["id", "name", "price"], "additionalProperties": false }
这样只要JSON中出现Schema未定义的属性(比如iddiff),验证时就会直接抛出错误。
方法二:配置Jackson ObjectMapper严格模式
如果你不想修改Schema,也可以通过配置ObjectMapper来强制检测未知属性,不过这种方式更偏向于反序列化阶段的校验:
ObjectMapper mapper = new ObjectMapper(); // 开启遇到未知属性时抛出异常的配置 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true); // 后续进行反序列化或验证操作 YourTargetClass target = mapper.readValue(yourJsonString, YourTargetClass.class);
2. 针对org.everit.json.schema库
如果你用的是这个第三方Schema验证库,需要在构建Schema时显式设置禁止额外属性:
ObjectSchema schema = ObjectSchema.builder() .addPropertySchema("id", IntegerSchema.builder().build()) .addPropertySchema("name", StringSchema.builder().build()) .addPropertySchema("price", NumberSchema.builder().build()) .addPropertySchema("tags", ArraySchema.builder().items(StringSchema.builder().build()).build()) .additionalProperties(false) // 关键配置,禁止未知属性 .build(); // 执行验证,此时存在未知属性会抛出ValidationException schema.validate(yourJsonObject);
3. 通用解决思路(适用于其他合规库)
不管你用的是哪个JSON Schema验证库,核心逻辑都是在Schema中启用additionalProperties: false约束——这是JSON Schema标准中定义的规则,只要你的库支持标准规范,这个配置就能生效。
另外要注意:如果你的Schema是通过工具从POJO自动生成的,记得检查生成工具的配置,确保它会自动添加这个约束,或者手动修改生成后的Schema文件。
内容的提问来源于stack exchange,提问作者Sajna
相关产品推荐
相关产品推荐

