【发布时间】:2013-02-09 11:32:50
【问题描述】:
在我能找到的关于使用 JSON 架构的内容中,描述有效数据、验证存储数据和验证输入数据的任务似乎存在混淆(或至少缺乏区别)。
一个典型的例子如下:
var schema = {
type: 'object',
properties: {
id: { type: 'integer', required: true },
name: { type: 'string', required: true },
description: { type: 'string', required: false }
}
};
这很适合描述数据存储中的有效数据应该是什么样子,因此也可以验证它(后者并不是非常有用——如果它在存储中它应该已经有效):
var storedData = {
id: 123,
name: 'orange',
description: 'delicious'
};
验证输入的效果不是很好。 id 很可能留给应用程序生成,而不是让用户作为输入的一部分提供。以下输入未通过验证,因为它缺少架构声明为 required 的 id:
var inputData = {
name: 'orange',
description: 'delicious'
};
很好, 有人可能会说,架构并不是用来验证直接输入的,只有在应用程序添加了 id 并且数据是用来验证的之后才应该进行验证被存储。
但是,如果架构不是用来验证直接输入,那么 1) JavaScript 验证器在浏览器中运行的意义,大概是直接输入和 2) 显然是面向输入的readonly规范中的架构功能?
考虑到可以设置一次但不能更新的属性(如用户名)以及不同的访问级别(例如,橙子的管理员和所有者应该能够更改description,而对于其他用户,它应该保持readonly)。
解决此问题的最佳(或至少有效)做法是什么?每个用例都有不同的架构,如下所示?
var baseSchema = {
type: 'object',
properties: {
id: { type: 'integer', required: true },
name: { type: 'string', required: true },
description: { type: 'string', required: false }
}
};
var ownerUpdateSchema = {
type: 'object',
properties: {
id: { type: 'integer', required: false, readonly: true },
name: { type: 'string', required: true },
description: { type: 'string', required: false }
}
};
var userUpdateSchema = {
type: 'object',
properties: {
id: { type: 'integer', required: false, readonly: true },
name: { type: 'string', required: false, readonly: true },
description: { type: 'string', required: false, readonly: true }
}
};
还是别的什么?
【问题讨论】:
标签: json validation schema jsonschema