数据描述与数据验证与输入验证的JSON模式

时间:2013-02-24 02:31:38

标签: json validation schema jsonschema

在我能找到的关于使用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

还是其他什么?

2 个答案:

答案 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没有定义如何实现与用户的交互,如果允许短暂的“坏”数据,或者如果在向系统添加更多数据之前必须纠正任何错误。这取决于你。