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

AJV JTD标记联合类型JSON定义报错,请求排查问题

问题分析与解决:AJV JTD标记联合类型Schema编译错误

你遇到的错误核心是混淆了标准JSON Schema和JTD(JSON Type Definition)的语法规范,AJV的JTD版本要求严格遵循JTD的结构规则,和普通JSON Schema差异很大。

具体错误点:

  • JTD的标记联合类型必须嵌套在union结构内,discriminator和mapping是union的子属性,不能直接作为顶层Schema
  • JTD没有number这个类型值,数值类型分为int(整数)和float(浮点数),你使用的"type": "number"不符合JTD规范
  • 所有属性的Schema必须严格符合JTD的节点类型定义(比如properties内的每个字段必须是合法的JTD节点)

修正后的代码:

import Ajv from "ajv/dist/jtd"
const ajv = new Ajv()

const Filter = {
  // JTD的标记联合必须包裹在union中
  "union": [
    {
      "discriminator": "direction",
      "mapping": {
        "gt": {
          "properties": {
            // 替换为JTD支持的float类型(整数用int)
            "amount": { "type": "float" }
          }
        },
        "lt": {
          "properties": {
            "amount": { "type": "float" }
          }
        },
        "et": {
          "properties": {
            "range": {
              "properties": {
                "top": { "type": "float" },
                "bottom": { "type": "float" }
              }
            }
          }
        }
      }
    }
  ]
};

const validateFilter = ajv.compile(Filter);

// 测试示例
console.log(validateFilter({ direction: "gt", amount: 100 })); // true
console.log(validateFilter({ direction: "et", range: { top: 200, bottom: 100 } })); // true
console.log(validateFilter({ direction: "lt", amount: "100" })); // false(类型错误)
console.log(validateFilter({ direction: "gt", range: { top: 100 } })); // false(属性不匹配)

关键修改说明:

  1. 把整个鉴别器结构放到union数组中,这是JTD定义标记联合的强制要求
  2. 将所有"type": "number"替换为"type": "float"(如果只需要整数,改用"type": "int")
  3. 确保每个子Schema的结构完全符合JTD的节点规则,没有混用JSON Schema的语法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:33:30