1

我正在尝试将现有(和正在工作的)客户端 jQuery 验证模式移动到 JSONSchema,以允许自己在客户端和服务器上验证任意 JSON。

我的应用程序本质上是一堆巨大的表单,其中包含许多复杂的逻辑,根据用户对其他问题的回答来确定应该问哪些问题。每个表单都有 200 多个字段。

现在我只做客户端验证,大约 99% 的时间都运行良好。浏览器问题已经出现过几次,但都不是灾难性的。话虽如此,我想做服务器端验证(!)。

在阅读了 JSONSchema 草案并浏览了一些 v3 实现之后,似乎我可能会丢失我的应用程序所依赖的一些更复杂的规则。我想确保在向任何方向移动太远之前我没有遗漏任何东西。

一些例子:

“如果 x == 10,则 y 是必需的,否则它是可选的”

10 可以是文字值、枚举等,但我需要能够引用同一结构中的另一个字段并保证它的值不仅存在,而且等同于特定类型/值。

我认为这在 JSONSchema list 上的这个线程中得到了解决

“如果 x = 今天的日期,y = 明天的日期,那么 x > y”

此逻辑将用于确保“开始”日期在“结束”日期之前。

从我所看到的情况来看,没有这样的事情,我能看到的唯一方法是将一个新的评估过的 JSON 块作为模式传递。

我发现最能满足上述需求的是CERNY

如果我叫错了树,请告诉我。我还研究了在客户端和服务器上运行的backbone.js。

tl;博士;

我想为大型复杂表单维护一组验证规则,并将这些验证规则应用于客户端和服务器端的任意 JSON 文档。

4

1 回答 1

0

有很多技巧,但并非所有技巧都是可能的。例如,如果 x == 10 则需要 y 可以通过类似(草案 3)来实现:

"type":[
{"properties":{"x":{"enum":[10]}, "y":{"required":true}}},
{"properties":{"x":{"disallow":[{"enum":[10]}]}}}
]

比方说,这是可能的,但非常棘手......模式基本上应该验证结构,而不是它的内容(即使这个属性很少)

我个人喜欢的另一种可能的方式是使用基于外部 url 的模式“扩展”当前验证图。这个想法是在一个 url 上发送当前文档的参数,该参数将根据这些参数返回相关模式。

例子:

{
"extends":{"$ref":"http://checkCustomValidity/{x}/{y}/"};
}

在“运行时”,发送回的模式可能是{"disallow":"any"}如果不允许或{}如果可以

这很有用,因为 url 可以同时用于客户端和服务器端(您的客户端不会完全独立,但在某些情况下,您不能)

现实生活中的用法是在必须使用远程服务的情况下。例如,如果我必须在注册期间检查我的昵称是否已在服务器上使用。我编写了一个响应请求路径的服务器端 Web 服务:http://www.server.com/isNicknameUsed/{nickname}

于 2012-01-31T19:16:03.343 回答