CSV导入JSON Schema:块可选配置与无表头条件验证问题
CSV 导入用 JSON Schema 优化方案
一、调整001/002体块的合法性规则
你当前的Schema要求同时存在001和002体块,要改成仅存其中一类也合法,只需用anyOf替代原来同时校验两个contains的逻辑:
{ "type": "array", "items": { "type": "array" }, "required": [0, -1], // 强制头块(第0行)和尾块(最后一行)存在 "allOf": [ { "properties": { "0": { "const": ["000"] } } }, // 验证头块是000 { "properties": { "-1": { "const": ["999"] } } }, // 验证尾块是999 // 核心调整:只要存在001或002其中一种体块就合法 { "anyOf": [ { "contains": { "items": { "0": { "const": "001" } } } }, { "contains": { "items": { "0": { "const": "002" } } } } ] } ] }
anyOf会允许数组中存在001、002,或者两者同时存在的情况,完全符合你的需求。
二、实现无表头列的条件验证
因为CSV没有表头,直接用数组索引定位列(注意:JSON数组索引从0开始,第N列对应索引N-1)。用if-then规则实现“第5列值为C时第4列必须为日期”的逻辑:
{ "type": "array", "items": { "type": "array", "if": { "properties": { "4": { "const": "C" } // 匹配第5列(索引4)值为C的行 }, "required": [4] // 确保第5列存在,避免空行干扰 }, "then": { "properties": { "3": { "format": "date" } // 强制第4列(索引3)为日期格式 }, "required": [3] // 确保第4列不为空 } } }
如果你的验证工具对format: date支持有限,可以用pattern替换,比如匹配YYYY-MM-DD格式:
"3": { "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }
完整整合后的Schema
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "array", "items": { "type": "array", // 行级条件验证规则 "if": { "properties": { "4": { "const": "C" } }, "required": [4] }, "then": { "properties": { "3": { "format": "date" } }, "required": [3] } }, "allOf": [ // 头块验证 { "properties": { "0": { "type": "array", "items": { "0": { "const": "000" } } } }, "required": [0] }, // 尾块验证 { "properties": { "-1": { "type": "array", "items": { "0": { "const": "999" } } } }, "required": [-1] }, // 体块合法性规则 { "anyOf": [ { "contains": { "items": { "0": { "const": "001" } } } }, { "contains": { "items": { "0": { "const": "002" } } } } ] } ] }
注意事项
- 确认列索引:如果你的业务中列是从1开始计数,务必对应好JSON数组的索引(第N列→索引N-1),避免验证错误。
- 日期格式兼容性:部分轻量验证工具可能不支持
format: date,用pattern匹配具体格式更稳妥。 - 多实例支持:
contains关键字天然支持匹配多个符合条件的行,满足001/002体块多实例的需求。
内容的提问来源于stack exchange,提问作者GaryB
相关产品推荐
相关产品推荐

