在前端有效地验证嵌套 JSON schema/config
Efficiently validate nested JSON schema/config on front end
我在 typescript
项目中有以下 JSON 配置。我想在 运行 时间内在前端验证这一点。我正在寻找类似于 node-convict
的解决方案。
我需要验证
- 唯一
id
/ 没有重复的 ID。
- 唯一名称。
- 必填属性非空
type
- 有条件地输入多个子项,例如如果类型 ===
folder
他们
应该有 children
道具。它可以是一个空数组。
- 多层嵌套对象。
我找到了 AJV
。 AJV 文档仅指整个对象是唯一的,而不是特定的属性。我可能会提出自己的想法并进行一些递归验证。但是,我正在寻找最有效的解决方案,无论是使用 ajv、另一个库还是我可以用来验证这一点的有效数据结构。
如果使用外部库,则需要与打字稿兼容。我不是在寻找打字稿编译时验证。
[{
"type": "folder",
"name": "",
"id": 1, // UUID
"chldren": [{
"id": 11, // UUID
"type": "table", // TABLE TYPE
"name": "Some Table 1",
"meta": {},
"dataSource": "..........."
},
{
"type": "folder", // FOLDER TYPE
"name": "",
"id": 111, // UUID
"chldren": [{
"type": "folder",
"name": "",
"id": 1111, // UUID
"chldren": [{
"id": 11111, // UUID
"type": "table",
"name": "Some Another Table",
"meta": {},
"dataSource": "..........."
}]
}]
}
]
}]
我建议从版本 16 开始使用 Joi data validation library. It has had browser support。
例子如下e.g.
import Joi from '@hapi/joi';
const schema = Joi.object({
type: Joi.string()
.alphanum()
.required(),
id: Joi.number()
.integer()
// I've not defined the whole schema for your object...
})
然后您可以使用以下方法验证您的对象:
schema.validate({ type: 'folder', id: 1 });
// -> { error: null, value: { type: 'folder', id: 1 }}
或者:
try {
const value = await schema.validateAsync({ type: 'folder', id: 1 });
}
catch (err) { }
您可以从 here 获取 Joi 的 TypeScript 类型。
可以找到此工作的示例 here。
我在 typescript
项目中有以下 JSON 配置。我想在 运行 时间内在前端验证这一点。我正在寻找类似于 node-convict
的解决方案。
我需要验证
- 唯一
id
/ 没有重复的 ID。 - 唯一名称。
- 必填属性非空
type
- 有条件地输入多个子项,例如如果类型 ===
folder
他们 应该有children
道具。它可以是一个空数组。 - 多层嵌套对象。
我找到了 AJV
。 AJV 文档仅指整个对象是唯一的,而不是特定的属性。我可能会提出自己的想法并进行一些递归验证。但是,我正在寻找最有效的解决方案,无论是使用 ajv、另一个库还是我可以用来验证这一点的有效数据结构。
如果使用外部库,则需要与打字稿兼容。我不是在寻找打字稿编译时验证。
[{
"type": "folder",
"name": "",
"id": 1, // UUID
"chldren": [{
"id": 11, // UUID
"type": "table", // TABLE TYPE
"name": "Some Table 1",
"meta": {},
"dataSource": "..........."
},
{
"type": "folder", // FOLDER TYPE
"name": "",
"id": 111, // UUID
"chldren": [{
"type": "folder",
"name": "",
"id": 1111, // UUID
"chldren": [{
"id": 11111, // UUID
"type": "table",
"name": "Some Another Table",
"meta": {},
"dataSource": "..........."
}]
}]
}
]
}]
我建议从版本 16 开始使用 Joi data validation library. It has had browser support。
例子如下e.g.
import Joi from '@hapi/joi';
const schema = Joi.object({
type: Joi.string()
.alphanum()
.required(),
id: Joi.number()
.integer()
// I've not defined the whole schema for your object...
})
然后您可以使用以下方法验证您的对象:
schema.validate({ type: 'folder', id: 1 });
// -> { error: null, value: { type: 'folder', id: 1 }}
或者:
try {
const value = await schema.validateAsync({ type: 'folder', id: 1 });
}
catch (err) { }
您可以从 here 获取 Joi 的 TypeScript 类型。
可以找到此工作的示例 here。