You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:01:43