在您的富 Internet 应用程序中使用 JSON Schema 验证

使用 JSV 和 Dojo 提高可靠性

复杂的 AJAX 应用程序可以与数百个不同的 JSON 服务进行交互,因此,引入了对客户端验证的需求。本文将对几个 JSON Schema 验证库进行比较,了解如何使用库来验证您的 JSON 对象。这样做的一个好处是,您可以下载样例实用工具,帮助您编写自己的模式,并参照这些工具来验证对象。

Mr. Nick Maynard, Web 2.0 顾问, IBM

Author photoNick Maynard 效力于英国 Hursley 的 IBM Software 实验室的 Business Solutions 团队。他的专长是 Dojo、Ajax、Web 编程、Web 服务和 Linux 技术。



2012 年 11 月 02 日

概述

AJAX 应用程序依赖于符合预期的 JSON 服务。如果服务没有按预期的格式进行响应,或者使用无效的内容进行响应,则会发生意外行为。对于复杂应用程序,您可以通过实现自定义案例来验证服务响应,从而减轻发生意外行为的风险。另外,您还可以利用 JSON Schema 来验证输入。

常用的缩略语

  • HTML:超文本标记语言
  • JSON:JavaScript 对象表现法
  • JSV:JSON Schema 验证器

JSON Schema 是一种草案标准 (draft standard),它指定了一种基于 JSON 的格式来定义 JSON 数据的结构。在撰写本文时,最新的草案标准版本是 draft-03(参阅 参考资料)。

本文将对几个 JSON Schema 验证例程进行比较。了解如何使用一些一流的库,并探讨创建库来验证通信的注意事项和最佳方案。本文还将介绍一种新的实用工具,帮助您编写自己的 JSON Schema。

下载 本文使用的样例。


为您的应用程序选择一个库

为您的应用程序选择一个库可能会是一件复杂的工作。每个应用程序都拥有不同的约束,这些约束会影响您的选择。表 1 简要概述了四个 JavaScript JSON Schema 库的特性。

表 1. 针对 JavaScript 的 JSON Schema 验证库
库(作者)草案版本支持库的大概规模
JSV: JSON Schema 验证器 (Gary Court)draft-01、draft-02 和 draft-03120KB
json-schema (Kris Zyp)draft-0310KB(需要 CommonJS)
dojox.json.schema (Kris Zyp)draft-0210KB(需要 Dojo)
schema.js (Andreas Kalsch)draft-02(部分)10KB(需要 CommonJS)

基于 Dojo 的应用程序可能会使用 dojox.json.schema 库,因为该库包含在工具箱中。支持多个版本的(草案)标准的应用程序可能会使用 JSV。

dojox.json.schema 看上去像是 json-schema 的一个分支,所以它们的用法非常相似。schema.js 只实现 draft-02 的一个子集。本文主要关注使用 dojox.json.schema 和 JSV 的示例。


使用 dojox.json.schema

清单 1 显示了一个验证简单对象的 HTML 代码片段。该代码旨在将此对象插入 head HTML 元素中。

清单 1. dojox.json.schema 的单独使用
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.0/dojo/dojo.js"
    type="text/javascript"></script>

<script type="text/javascript">

    require(["dojox/json/schema"], function() {
        // Object to validate
        var successObj = { 
            "foo" : "bar"
        };
        var failureObj = {
            "foo" : 1234
        };
        
        // Schema
        var schema = { 
            "type": "object",
            "properties" : {
                "foo" : {
                    "type" : "string"
                }
            }
        };
        
        // Run validation, which should succeed
        // Change this line to use failureObj to see the failure case
        var result = dojox.json.schema.validate(successObj, schema);
        
        // Check results
        if (result.valid) {
            // Success, do something
            alert("Object is valid");
        } else {
            // Failure - extract the errors array 
            var errorArr = result.errors;
            alert("property : " + errorArr[0].property + "\nmessage :  " 
                + errorArr[0].message);
        }
    });
    
</script>

使用 JSV

清单 2 是验证简单对象的一个 HTML 代码片段。该代码旨在将此对象插入 head HTML 元素中。

清单 2. JSV 的单独使用
<!-- NB: For actual use, you should download a copy of the libraries yourself.
            github is not a CDN. -->
<script src="https://raw.github.com/garycourt/JSV/master/lib/uri/uri.js"
    type="text/javascript"></script>
<script src="https://raw.github.com/garycourt/JSV/master/lib/jsv.js"
    type="text/javascript"></script>
<script src="https://raw.github.com/garycourt/JSV/master/lib/json-schema-draft-03.js"
    type="text/javascript"></script>

<script type="text/javascript">

        // Object to validate
        var successObj = { 
            "foo" : "bar"
        };
        var failureObj = {
            "foo" : 1234
        };
        
        // Schema
        var schema = { 
            "type": "object",
            "properties" : {
                "foo" : {
                    "type" : "string"
                }
            }
        };
        
        // Run validation, which should succeed
        var env = JSV.createEnvironment("json-schema-draft-03"); 
        // Change this line to use failureObj to see the failure case
        var result = env.validate(successObj, schema);
        
        // Check result
        if (result.errors.length === 0) {
            // Success, do something
            alert("Object is valid");
        } else {
            // Failure - extract the errors array 
            var errorArr = result.errors;
            alert("uri : " + errorArr[0].uri + "\nmessage :  " 
                + errorArr[0].message);
        }

</script>

JSV 在 errors 数组中提供了一些高级故障信息。每个错误可能包含以下属性:

  • message:人类可读的错误消息。
  • uri:失败对象所在位置的 URI。
  • schemaUri:引起故障的模式的所在位置的 URI。
  • Attribute:引起故障的模式约束。
  • Details:包含更多详细信息的自由格式数组,比如预期值。

结合使用 JSON Schema 验证和 XMLHttpRequest

如果您正在开发复杂的 AJAX 应用程序,请考虑使用以上的技术来验证 AJAX 通信。当可以将模式用作一个 JavaScript 对象时,验证某个对象会非常简单。有许多获得模式对象的解决方案。

在编写一个库来获取模式并验证通信时,请考虑以下事项:

  • 页面加载的日常开销。预加载模式可能很吸引人,但有可能减缓页面加载时间。
  • AJAX 调用的日常开销。延迟加载 (Lazy-loading) 模式会影响使用每个模式的第一次调用。验证每一个通信可能会引起性能问题。请考虑将验证应用到更多的复杂服务中。

编写 JSON 模式

JSON Schema 的定义有许多细微的差别,所以编写和测试模式会是一项很具挑战性的工作。本文提供了 JSON Schema Lint 实用工具(您可以 下载 它),帮助您创建并测试 JSON Schema。

提示与技巧

  • JSON Schema Internet Draft(参阅 参考资料)拥有 JSON Schema 规范的完整定义,并且是一个非常有价值的资源。请务必查看最新版的草案。
  • 可以考虑使用 JSON Schema 来帮助实现文档编制服务。可以使用 description 属性来描述属性内容。
  • 在编写模式时,要平衡应用程序和验证严密性的需求。完全定义每一个属性可能需要更加严格的验证,但是,如果服务随着应用程序的发展而发展,则会引起脆弱性问题。JSON Schema 支持局部验证,可以在这一方面为您提供帮助。
  • 使用 JSON Schema 的高级功能来锁定属性。您可以使用 additionalProperties, enum, minItems, maxItems 等来增加约束。
  • 当您需要考虑一个可能具有众多类型的属性时,可以使用一个数组来定义这些类型。此外,您还可以使用 any 类型。

结束语

在本文中,您了解了如何通过使用两个库的 JSON Schema 来验证 JavaScript 对象,还探索了创建库来验证通信的一些注意事项,以及创建模式的最佳实践。本文还提供一个实用工具,您可以用它来帮助创建和测试您自己的模式。


下载

描述名字大小
展示 dojox.json.schema 的用法的样例dojox_json_schema-example.html2KB
展示 JSV 的用法的样例jsv-example.html2KB
创建并测试 JSON Schema 的实用工具jsonschema.zip140KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Web development
ArticleID=844092
ArticleTitle=在您的富 Internet 应用程序中使用 JSON Schema 验证
publish-date=11022012