在我能找到的关于使用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
很可能留给应用程序生成,而不是由用户提供作为输入的一部分。以下输入未通过验证,因为它缺少架构声明为id
的{{1}}:
required
很好,有人可能会说,架构并不意味着验证直接输入,验证应该只在应用程序添加var inputData = {
name: 'orange',
description: 'delicious'
};
并且数据是什么之后才会发生意味着存储。
如果架构不是为了验证直接输入,那么,1)在浏览器中运行的JavaScript验证器的重点是什么,可能是直接输入和2)显然是面向输入的{{1规范中的模式功能?
当考虑可以设置一次但未更新的属性(如用户名)以及不同的访问级别(例如,管理员和橙色的所有者应该能够更改{{1})时,地面会变得更加震撼},而对于其他用户,它应该保持id
)。
处理此事的最佳(或至少是工作)做法是什么?每个用例的不同模式,如下所示?
readonly
还是其他什么?
答案 0 :(得分:1)
旁注:“required”现在是v4中父元素中的数组,“readOnly”的大小写不同 - 我将使用该表单作为我的示例
我同意验证存储的数据非常罕见。如果您只是描述数据,那么您不需要指定需要“id”。
另一个要说的是这些模式应该都有可以引用它们的URI(例如/schemas/baseSchema
)。此时,您可以扩展模式以使其中某些模式成为“id”:
var ownerInputSchema = {
type: 'object',
properties: {
id: {type: 'integer', readOnly: true},
name: {type: 'string'},
description: {type: 'string'}
},
required: ['name']
};
var userInputSchema = {
allOf: [{"$ref": "/schemas/inputSchema"}],
properties: {
name: {readOnly: true}
}
};
var storedSchema = {
allOf: [{"$ref": "/schemas/inputSchema"}],
required: ["id"]
}
虽然如上所述,我不确定storedSchema
是否必要。您最终得到的是一个“所有者”架构,它描述了数据格式(由服务提供,并由数据所有者编辑),并且您有一个辅助架构,可以扩展该架构以在其他属性上声明readOnly
。
答案 1 :(得分:0)
嗯,我认为Json-Schema的目的在v4中有更明确的定义。目标是帮助您进行数据结构验证(无论是存储,是通过网络发送给您,还是以交互方式创建)。
readOnly不是Json-Schema验证属性,因为它没有验证约束。在Json-Schema v4中,readOnly是超模式定义的一部分。它可用于表示您无法在POST请求中更改此属性。
Json-schema没有定义如何实现与用户的交互,如果允许短暂的“坏”数据,或者如果在向系统添加更多数据之前必须纠正任何错误。这取决于你。