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

JSON Schema 2020-12版本if-then条件验证异常排查

解决方案

1. 修正子Schema(test.json)的规则定义

最常见的问题是全局required数组错误包含了referenceval,导致无论tableName取值如何,该字段都会被强制要求必填。正确的做法是仅在对应if-then的then块中声明字段必填,全局仅保留tableName为必填项:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "tableName": {
      "type": "string",
      "enum": ["TABLE1", "TABLE2"]
    },
    "referenceval": { "type": "string" },
    "code": { "type": "string" }
  },
  "required": ["tableName"],
  "allOf": [
    {
      "if": {
        "properties": { "tableName": { "const": "TABLE1" } },
        "required": ["tableName"]
      },
      "then": {
        "required": ["referenceval"]
      }
    },
    {
      "if": {
        "properties": { "tableName": { "const": "TABLE2" } },
        "required": ["tableName"]
      },
      "then": {
        "required": ["code"]
      }
    }
  ]
}

2. 确保主Schema(cache_test.json)的引用路径与代码配置一致

主Schema中$ref的路径必须和代码中schemas集合的key完全匹配:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "https://json-schema.org/schema/test.json"
}

3. 优化代码中Schema的加载逻辑

当前代码将子Schema序列化后转为字符串存入集合,可简化为直接加载JsonNode对象,避免序列化/反序列化可能导致的格式丢失:

// 替换原有的子Schema加载逻辑
JsonNode jsonNodeSubSchema = mapperSubSchema.readValue(subSchemaStream, JsonNode.class);
JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012,
    builder -> builder.schemaLoaders(schemaLoaders -> schemaLoaders.schemas(
        Collections.singletonMap("https://json-schema.org/schema/test.json", jsonNodeSubSchema))));

4. 验证依赖库版本

确保使用的com.networknt:json-schema-validator为最新稳定版本,旧版本可能存在JSON Schema 2020-12规范的兼容性bug。

测试验证

用以下用例验证效果:

  • 当tableName: "TABLE1"且缺少referenceval:应提示referenceval必填
  • 当tableName: "TABLE2"且缺少referenceval:无该字段的错误提示,仅当缺少code时触发错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:37:03