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

要了解JSON Schema是什么,我们应该首先了解JSON是什么。

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

从本质上讲,JSON建立在以下数据结构上:

对象:

{ "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数据结构,以及其中各个字段的类型信息在这里得到了很清晰的说明。

{

"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测试的过程,提高了测试的效率。

json schema多种形式_什么是JSON Schema?及其应用方式......相关推荐

  1. json schema多种形式_什么是JSON Schema?

    什么是JSON Schema? 如果你曾经使用过XML Schema,RelaxNG或ASN.1,那么你很可能已经知道什么是JSON Schema,并且可以跳过本文的阅读.如果你是头一次听说,或者听过 ...

  2. json schema多种形式_如何快速写出Json Schema,校验Json Schema

    得到一个Json文件,如何快速的去测试呢? 难道是一个个节点的去验证吗?那显然效率太低了. 一般推荐使用Json Schema(一种Json的数据结构定义)去校验. 对于JsonSchema,有很多种 ...

  3. 易语言json置入_易语言json操作模块源码

    易语言json操作模块源码 系统结构:初始化,解析,到文本,置属性,置属性对象,置属性数值,取属性数值,取属性对象,取通用属性,取属性,成员数,加成员,取成员,取成员文本,置成员,删成员,置类型,赋值 ...

  4. idea json转为对象_数据存储—JSON

    JSON文件存储 JSON全称JavaScript Object Notation,也就是JavaScript对象标记,它通过对象和数组的组合来表示数据. 1.对象和数组 对象:在JavaScript ...

  5. java 解析 json 索引对象_怎么获取json对象的属性和值

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript(Standard ECMA-262 ...

  6. 安卓大json文件解析_安卓解析 json 4种格式 全解析

    1  简单的一个  { ,,,,} 2  里面有数组 { , [{,,},{,,}],} 3 直接一个数组 4 数组里有数组 5 其他情况? 没有吧,除非json格式不规范 主代码: package ...

  7. json schema多种形式_Json Schema简介

    1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...

  8. json schema多种形式_JSON Schema 简介

    在前后端分离架构下,JSON 格式被广泛用于前端的数据交互,并成为事实上的规范,但前端在编写表单的过程中,依旧对着字段和后端进行 CRUD,这其中的效率有可能提升吗?有什么规范能通用解决表单类的中后台 ...

  9. json schema多种形式_JsonSchema使用详解

    JSON Schema是一个用于验证JSON数据结构的强大工具, 我查看并学习了JSON Schema的官方文档, 做了详细的记录, 分享一下. 我们可以使用JSON Schema在后续做接口测试中做 ...

最新文章

  1. MySQL数据库性能优化之一
  2. FastDFS的配置、部署与API使用解读(7)Nginx的FastDFS模块(转)
  3. java分隔符的引号,使用分隔符拆分带引号的字符串
  4. ECharts学习(1)--简单图表的绘制
  5. Qt 中获取三种坐标类型
  6. wangEditor-3.1.1 自己扩展的, 扩展图片添加alt标签
  7. 模型参数太多怎么办?用谷歌高效训练库GPipe啊
  8. vue 使用echart图表 随屏幕放大缩小_哈特(HART)475手操器使用教程
  9. 图像处理九:拟合曲线
  10. LeetCode 49 - Group Anagram 归类同构字
  11. TCP网络通讯如何解决分包粘包问题
  12. 手机号正则表达式(含大陆港澳台)
  13. 如何写软件设计文档[转]
  14. Android面试准备复习之Android知识点大扫描
  15. MySQL事务隔离及锁机制
  16. 如何以2万美元出售你的软件
  17. Fixing DSDT
  18. android 单元布局,在Android布局中挖洞
  19. 世界上最遥远的距离,是我在if里你在else里
  20. 永不服输的Java之路---重学Java (第二章)

热门文章

  1. kafka概念使用简介注意点
  2. 18.虚拟机linux上网问题
  3. tensorflow怎样调用gpu_tensorflow / tensorflow-gpu / tensorflow-cpu区别?
  4. android 7.0 裁剪,Android 7.0中拍照和图片裁剪适配的问题详解
  5. matlab读取心电txt数据画图,图解MIT-BIH数据库心电数据下载和Matlab读取程序
  6. ef1a启动子_常见的真核和原核表达系统的启动子(promoters)
  7. 前段react技术架构图_基于 React 的可视化编辑平台实践
  8. 极性大小判断技巧_“赫洛克效应”:夸奖能激发孩子的潜能,但父母要掌握技巧与原则...
  9. Dreanmwear能做php模板吗,PHPword模板的使用
  10. 深度学习和目标检测系列教程 9-300:TorchVision和Albumentation性能对比,如何使用Albumentation对图片数据做数据增强