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(属性不匹配)
关键修改说明:
- 把整个鉴别器结构放到
union数组中,这是JTD定义标记联合的强制要求 - 将所有
"type": "number"替换为"type": "float"(如果只需要整数,改用"type": "int") - 确保每个子Schema的结构完全符合JTD的节点规则,没有混用JSON Schema的语法
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

