什么是JSON Schema?

什么是JSON Schema?编程

若是你曾经使用过XML Schema,RelaxNG或ASN.1,那么你极可能已经知道什么是JSON Schema,而且能够跳过本文的阅读。若是你是头一次据说,或者听过过这个词汇但不了解,那么你来对地方了。数组

要了解JSON Schema是什么,咱们应该首先了解JSON是什么。浏览器

JSON表明“JavaScript Object Notation”,一种简单的互联网数据交换格式。因为JavaScript存在于绝大多数Web浏览器中,而JSON基于JavaScript而来,所以很容易在JavaScript中的获得支持。同时,它已被证实足够有用且足够简单,如今也被用于许多其余不涉及互联网数据交换的环境中。安全

从本质上讲,JSON创建在如下数据结构上:bash

对象:
{ "key1": "value1", "key2": "value2" }
数组:
[ "first", "second", "third" ]
数值:
42 3.1415926
字符串:
"This is a string"
布尔:
true false
空值:
null
复制代码

以上这些类型在大多数编程语言中都有接近的对照类型,但它们可能有不一样的名称。数据结构

利用这些简单的数据类型,能够表示出各类结构化数据。然而,这种巨大的灵活性带来了巨大的责任,由于一样的概念能够用无数种方式表现出来。例如,你能够想象以不一样方式表示有关JSON中某人的信息:编程语言

{ 
  "name": "George Washington",
  "birthday": "February 22, 1732",
  "address": "Mount Vernon, Virginia, United States"
}
复制代码

以及:工具

{ 
  "first_name": "George",
  "last_name": "Washington",
  "birthday": "1732-02-22",
  "address": {
    "street_address": "3200 Mount Vernon Memorial Highway",
    "city": "Mount Vernon",
    "state": "Virginia",
    "country": "United States"
  }
}
复制代码

以上这两种表述一样有效,但第二种显然比第一种更正式。数据记录的设计在很大程度上取决于其在应用程序中的预期用途,所以这里没有正确或错误的答案。可是,当应用程序经过API请求并指望获得一我的的JSON记录时,重要的是要确切知道该记录应该如何组织。也就是说,当咱们须要知道JSON数据中预期的字段以及值的表示方式时,这就是JSON Schema的用武之地。测试

如下JSON Schema片断描述了上面第二个例子是如何构建的。这里咱们不对其中的细节解释,但若是仔细观察,你能够看到,以上第二个例子中的JSON数据结构,以及其中各个字段的类型信息在这里获得了很清晰的说明。spa

{
  "type": "object",
  "properties": {
    "first_name": {
      "type": "string"
    },
    "last_name": {
      "type": "string"
    },
    "birthday": {
      "type": "string",
      "format": "date"
    },
    "address": {
      "type": "object",
      "properties": {
        "street_address": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "state": {
          "type": "string"
        },
        "country": {
          "type": "string"
        }
      }
    }
  }
}
复制代码

经过“验证”针对此JSON Schema的第一个示例JSON数据,您能够看到它失败:

{
  "name": "George Washington",
  "birthday": "February 22, 1732",
  "address": "Mount Vernon, Virginia, United States"
}
复制代码

可是,第二个例子经过:

{
  "first_name": "George",
  "last_name": "Washington",
  "birthday": "22-02-1732",
  "address": {
    "street_address": "3200 Mount Vernon Memorial Highway",
    "city": "Mount Vernon",
    "state": "Virginia",
    "country": "United States"
  }
}
复制代码

您可能已经注意到,JSON Schema自己是用JSON编写的。它是JSON数据的规范,而不是计算机程序。它只是“描述JSON数据结构”的声明格式。这既是它的优点,也是它的弱点(和其余Schema语言相似)。它很容易简洁地描述数据的表面结构,并可被用于在程序运行时自动验证数据。可是,因为JSON Schema不能包含任意代码,所以对没法表达的数据元素之间的关系存在某些限制。所以,对于足够复杂的数据格式的任何“验证工具”可能具备两个验证阶段:一个在结构级别,另外一个在语义级别。对于结构级别的检查,可使用Schema语言。对于语义级别的检查,可能须要使用更通用的编程语言来实现。

JSON Schema在API的设计与实现中具备至关重要的做用。具有JSON Schema校验能力的API实现能够帮助对来自用户输入数据的自动校验,以及应用在各种须要在程序运行时完成校验的场景中。这能够帮助开发者以更加规范、严谨的方式来描述本身的API上承载的JSON数据,同时少写许多手工校验的程序代码。

遗憾的是,目前流行的REST API设计并不能直接使用JSON Schema带来的这种能力,这很大程度上在于,在REST API的设计理念中,API请求的参数并非一个JSON对象,而是以资源模型的方式来描述,这使得没法使用JSON Schema来描述和自动校验这类API上传递的数据。

灵长科技CEAMS通用企业应用接口管理系统上,系统并无使用REST API的设计风格,而是参考了经典的SOAP协议设计,规定API的请求参数和返回结果必须是一个JSON对象或者数组,而且为开发者提供了包含JSON Schema支持的API规范设计向导,用户能够很方便地在这里设计和制定本身API上的JSON数据规范。同时,设计好的JSON Schema将在程序执行时,完成对请求和返回结果JSON数据的校验,帮助提升了API数据的安全性,而且避免了手写校验代码的繁琐。

除了用于完成JSON数据校验外,因为能够为JSON数据提供清晰、严谨的声明,JSON Schema在自动化API文档、自动化输入表单生成、JSON数据可视化等方面也有很好的应用场景。有很多开源项目提供了基于JSON Schema的自动化输入表单生成能力。CEAMS系统集成了其中知名的Angular Schema Form,用于为开发者提供的清晰、直观的API测试工具。这样的工具帮助开发者进一步简化了API测试的过程,提升了测试的效率。

相关文章
相关标签/搜索