JSON验证需兼顾语法合法与业务结构合规,应基于JSON Schema定义字段类型、必填性、枚举值等,并用AJV校验;再补充ID唯一性、依赖存在性等语义检查,辅以错误精确定位与导出元数据优化。

在复杂表单配置项的导入导出场景中,JSON 验证的核心不是只检查语法是否合法(JSON.parse 能过就行),而是确保结构符合业务预期——字段存在、类型正确、嵌套合理、必填项不缺失、枚举值在范围内等。光靠 try...catch 解析远远不够。
定义清晰的 JSON Schema 是验证前提
为表单配置设计一份可读、可维护的 JSON Schema(如使用 JSON Schema Draft-07/2020-12),明确描述每个字段的:
• 类型(string / number / boolean / object / array)
• 是否必需(required)
• 字符串长度或正则约束(minLength、pattern)
• 数值范围(minimum、maximum)
• 对象属性结构(properties + additionalProperties: false 防止野字段)
• 数组项规则(items 指定每项结构)
• 枚举值(enum,比如 "type": ["input", "select", "date"])
用成熟库做结构化校验(推荐 ajv)
手写递归校验易出错、难覆盖边界。推荐使用 AJV(Another JSON Schema Validator):
示例:校验一个含字段列表、条件逻辑、默认值的表单配置
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
立即学习“Java免费学习笔记(深入)”;
import Ajv from 'ajv';
const ajv = new Ajv({ allErrors: true, strict: false });
// 定义 schema(简化版)
const formSchema = {
type: 'object',
required: ['version', 'fields'],
properties: {
version: { type: 'string', pattern: '^\d+\.\d+\.\d+$' },
fields: {
type: 'array',
minItems: 1,
items: {
type: 'object',
required: ['id', 'type', 'label'],
properties: {
id: { type: 'string', minLength: 1 },
type: { enum: ['input', 'select', 'checkbox', 'radio'] },
label: { type: 'string' },
options: { // select/radio 专属
type: 'array',
items: { type: 'object', required: ['value', 'label'] }
},
rules: { // 自定义校验规则
type: 'array',
items: { type: 'object', required: ['trigger', 'validator'] }
}
},
// 禁止出现 schema 未声明的字段(关键!)
additionalProperties: false
}
}
}
};
const validate = ajv.compile(formSchema);
// 导入时校验
function importFormConfig(jsonStr) {
try {
const data = JSON.parse(jsonStr);
const valid = validate(data);
if (!valid) {
console.error('配置校验失败:', validate.errors);
return { success: false, errors: validate.errors };
}
return { success: true, config: data };
} catch (e) {
return { success: false, errors: [`JSON 语法错误:${e.message}`] };
}
}
补充运行时语义校验(Schema 做不到的)
JSON Schema 能管结构,但管不了业务逻辑。需额外校验:
-
字段 ID 唯一性:遍历
fields数组,检查所有id不重复 -
条件依赖一致性:如某字段
showIf: { field: "status", value: "active" },需确认"status"确实在fields中存在 -
循环引用检测:若配置支持动态表达式(如
default: "{{user.name}}"),需防模板链路成环 -
敏感字段过滤(导出前):自动剔除
apiSecret、passwordPlaceholder等不应导出的字段
导入导出体验优化建议
• 导入失败时,**定位到具体字段和错误原因**(如“第3个字段的 options[0].value 缺失”),而非只报“校验失败”
• 提供「校验模式」按钮:用户粘贴 JSON 后可即时预览问题,不强制提交
• 导出时自动添加元数据:如 {"_exportedAt": "2024-05-20T10:30:00Z", "_schemaVersion": "1.2"},便于后续兼容升级
• 支持降级兼容:旧版配置导入时,用迁移函数自动补默认值、重命名字段(如 fieldType → type)

















