如何用networknt/json-schema-validator验证数组元素类型?
解决networknt/json-schema-validator数组元素类型验证不生效的问题
你忽略了JSON Schema规范中**additionalItems关键字**的默认行为,这是验证不生效的核心原因:
当items以数组形式定义(即元组验证,指定数组特定位置的元素规则)时,JSON Schema 2020-12规范默认additionalItems为true——意思是数组中超出items定义范围的元素不会被验证。你的输入[true,false,{},\"foo\"]只有第一个元素会被校验是否为整数,后面的元素因为additionalItems默认允许,所以不会触发错误。
而你提到的在线验证工具可能做了隐式处理(比如默认将additionalItems设为false),所以会报错,这和networknt严格遵循规范默认值的实现产生了差异。
两种修正方案
根据你的需求选择对应的方案:
1. 要求所有元素必须是整数
如果目标是数组内所有元素都要符合整数类型,直接把items改成对象形式(而非数组):
{ "$schema": "http://json-schema.org/draft/2020-12/schema#", "type": "array", "items": { "type": "integer" } }
2. 仅允许数组包含第一个指定类型的元素(禁止额外元素)
如果是元组验证场景,只允许数组有一个整数元素,不允许后续有其他元素,就添加"additionalItems": false:
{ "$schema": "http://json-schema.org/draft/2020-12/schema#", "type": "array", "items": [ { "type": "integer" } ], "additionalItems": false }
修正后的Java代码示例
以第一种方案为例,修改后运行就会输出预期的验证错误:
var schema = "{\n" + " \"$schema\": \"http://json-schema.org/draft/2020-12/schema#\",\n" + " \"type\": \"array\",\n" + " \"items\": {\n" + " \"type\": \"integer\"\n" + " }\n" + "}"; var input = "[true,false,{},\"foo\"]"; var factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012); var jSchema = factory.getSchema(schema); var errors = jSchema.validate(new ObjectMapper().readTree(input)); System.out.println("Errors: '"+errors.stream().map(ValidationMessage::getMessage).collect(joining(", ")) +"'");
内容的提问来源于stack exchange,提问作者jdo
相关产品推荐
相关产品推荐

