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

everit-org/json-schema库$data引用数值验证失败问题

解决everit-org/json-schema中$data引用minimum规则的验证失败问题

我之前踩过这个一模一样的坑!everit-org/json-schema库对$data引用的处理有个容易忽略的细节——它默认会先校验你的Schema本身是否符合JSON Schema的元规范,而minimum字段在元规范里预期是数字类型,但你这里用了{"$data": "1/toYear"}这个对象结构,所以它直接抛出了Schema结构不合法的错误,根本没走到动态引用验证的步骤。

问题根源

库的默认配置下,会严格检查约束字段的类型:minimum必须是数字,但你传入了一个包含$data的对象,所以触发了expected type: Number, found: Object的错误。

解决方案

你需要在创建SchemaValidator的时候,启用两个关键特性来支持$data引用:

  1. 开启$data引用支持:让库识别并处理$data关键字
  2. 跳过$data引用字段的Schema类型校验:告诉库不要因为约束字段是对象(而不是预期的数字)而报错

代码示例如下:

// 构建支持$data引用的验证器
SchemaValidator validator = SchemaValidatorBuilder.newBuilder()
    .enableFeature(ValidationFeature.ALLOW_DATA_REFERENCES)
    .enableFeature(ValidationFeature.SKIP_SCHEMA_VALIDATION_FOR_DATA_REFERENCES)
    .build();

额外检查点

  • 确认你的$data引用路径1/toYear是正确的:这个路径表示当前节点的父级(数组项)下的toYear字段,所以你的数据结构应该类似这样:
    {
      "qualificationsection": [
        {
          "fromYear": 2015,
          "toYear": 2020
        }
      ]
    }
    
  • 确保toYear字段确实是数字类型,否则动态引用后依然会触发验证失败。

验证流程

当你启用这两个特性后,库会:

  1. 不再校验minimum字段的类型(因为它知道这是一个$data引用)
  2. 解析$data路径,获取对应字段的值作为minimum的实际值
  3. 用这个动态获取的值来验证fromYear是否符合大于等于toYear的规则

内容的提问来源于stack exchange,提问作者Kashif Imran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:13:14