8

在我能找到的关于使用 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架构声明的内容required

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 }
    }
};

或者是其他东西?

4

2 回答 2

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在附加属性上声明。

于 2013-04-18T11:17:37.553 回答
0

好吧,我认为 Json-Schema 的目的在 v4 中定义得更清楚。目标是帮助您进行数据结构验证(无论是要存储它,它已经通过网络发送给您,还是您正在以交互方式创建)。

readOnly 不是 Json-Schema 验证属性,因为它没有验证约束。在 Json-Schema v4 中,只读是超模式定义的一部分。它可以用来表示您不能在 POST 请求中更改此属性。

Json-schema 没有定义你应该如何实现与用户的交互,如果你允许暂时的“坏”数据,或者在你向系统添加更多数据之前必须纠正任何错误。这取决于你。

于 2013-10-17T06:59:24.043 回答