在[javaScript和JSON](http://wendingding.com/2018/04/16/javaScript%E7%B3%BB%E5%88%97%20[05]-javaScript%E5%92%8CJSON/)这篇博文中已经对JSON的基础知识进行了系统的介绍,此文是JSON知识的**进阶内容**,本文输出和JSON有关的以下内容:

❐ JSON核心

❐ JSON的校验(JSON Schema)

一、JSON核心

JSON是一种数据交换格式,是当前网络通信中使用的主流数据格式。

JSON本身并不局限(依赖)于某项特定的技术,非私有且可移植,几乎所有的现代编程语言(javaScript | java | Ruby | C# | PHP | Object-C等)和平台都支持对JSON数据的序列化和反序列化处理,JSON主要应用在网络通信的数据格式Node用来存储项目元数据Kafka类似的消息平台以及MongoDB等NoSQL数据库中。

JSON流行的主要原因

  • (1) JavaScript语言的复兴和崛起
  • (2) JSON自身数据结构的简洁和紧凑特性
  • (3) 基于JSON的RESTful API呈现大规模增长
  • (4) Ecma国际和IETF相关的标准化工作让JSON获得行业认可

JSON的作者Douglas Crockford在创作时借鉴了JavaScript对象字面量的语法,也就是说JSON本身就是JavaScript对象字面量表示法的一个子集和JavaScript开发能够无缝融合,而JavaScript编程语言的复兴和崛起(前端 + Node后端生态)极大的推动了JSON的流行。

JSON的数据表示方式非常简洁,结构紧凑易于阅读而且其本身的结构与高级编程语言中的对象|字典|数组结构天然一致,与XML相比更适合面向对象的设计和开发。此外,JSON格式的文档通常比相同内容的XML文档更小,因此在进行网络传输和处理的时候更快、效率更高,JSON本身的这些特性加上相关技术环境的发展让它逐步替代XML成为互联网中主要的数据交换格式。

近些年,基于JSON的RESTful API呈现大规模爆炸式增长,包括LinkedIn、Github、Twitter、Facebook、Tumblr和Amazon等公司都提供基于JSON的RESTful API(备注 相关API可以访问programmableweb查询)。

JSON的标准化(成为一项技术标准),让JSON获得了行业内的认可,下面简单列出主要的标准化进程。

2001 年 JSON由Douglas Crockford提出。
2006 年 JSON由IETF通过RFC 4627进行首次标准化。
2013 年 Ecma国际通过ECMA 404 将JSON正式标准化。
2014 年 Tim Bray发布了RFC 7158和RFC 7159作为原始标准的改进版本(主要修正了4627标准中的一些错误)。

JSON数值的类型

JSON数值的类型主要指的是在JSON文档中,键值对冒号(:)后侧值的数据类型,主要包括:

  • null
  • 数值
  • 对象
  • 数组
  • 字符串
  • 布尔值

null是JSON中的一个特殊值,用来表示某个key(属性)没有值用作占位符,注意不能由引号括起来。

数值遵循JavaScript双精度浮点数格式,支持指数形式,但仅支持十进制数不支持8进制和16进制数。

对象由 { 和 } 把键值对(key-value)括起来,允许设置为空对象,可以内嵌在其他的对象或者是数组中。

数组由 [ 和 ] 把元素括起来,允许设置为空数组且不限制类型,可以内嵌在其他的对象或者是数组中。

字符串由包含在双引号间的N(>=0)个Unicode字符组成可包含由转义字符,但单引号字符串是非法的。

布尔值只存在true和false这两种值,且不能用引号把它们括起来,需注意JSON中没有为undefined值。

More ...

版本 ➤JSON的核心标准不会再有新的版本,适用"无版本"理念。

类型 ➤JSON数据在文件系统中存储的标准文件类型为.json,IANA为JSON文档指定的MIME(媒体类型)为application/json。

缩进 ➤JSON的编码规范并不存在与JSON数据缩进相关的话题,主要因为JSON本身是一种序列化格式而非呈现格式,所以缩进对JSON本身而言意义不大,在优化JSON现实的时候,常见的缩进方案是两格缩进或四格缩进。

工具 ➤

在线生成合法JSON文档的工具(1) JSONmate

在线生成合法JSON文档的工具(2) JSON Editor Online

在线校验JSON文档是否合法的工具(1) JSON Schema

在线校验JSON文档是否合法的工具(2) JSON Validate

快速生成大量测试JSON数据的工具推荐 JSON Generator

在线对复杂JSON数据格式化的工具推荐 JSON 在线格式化

创建|编辑JSON文件的时候,建议使用[JSON Editor Online](https://jsoneditoronline.org)在线工具,上图是其基本工作界面。

二、JSON Schema

JSON Schema是对JSON文档中的内容、结构和格式进行的声明,用于校验JSON文档。区别于普通的JSON校验工具,JSON Schema能够对JSON文档执行语法校验和严格的语义校验JSON Schema这种能够用于校验JSON文档内容和语义的工具能够有效提供服务的安全性,在消息系统中的应用能够确保数据格式的正确性,在API设计领域还能够帮助定义API协议等。

建议

从零开始对JSON文档的内容进行声明非常麻烦也没有必要,建议先使用JSONSchema.net网站来根据已有的JSON文档生成对应的Schema文档,然后再根据具体的校验规则来逐步修缮。

基本示例

这里先给出一份简单的JSON文档和对该文档的JSON Schema描述,然后再介绍JSON Schema的核心关键词和具体规则。

# 文件名 demo.json 注意该行不作为json文件的内容

{
"name": "wendingding",
"age": 18,
"email": "wendingding_ios@126.com",
"height": 1.73,
"isGoodMan": true,
"tags": [
"javaScript",
"object-C",
"C++",
"swift",
"php"
],
"car": {
"type": "A",
"number": "粤A 66666",
"price": 21344.88
}
}
# 文件名 demo-schema.json 注意该行不作为json文件的内容
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["name","age","email","height","isGoodMan","tags","car"],
"properties": {
"name": {
"type": "string",
"examples": [ "wendingding" ],
},
"age": {
"type": "integer",
"examples": [ 18 ]
},
"email": {
"type": "string",
"examples": ["wendingding_ios@126.com"],
},
"height": {
"type": "number",
"examples": [ 1.73 ]
},
"isGoodMan": {
"type": "boolean",
"examples": [ true]
},
"tags": {
"type": "array",
"items": {
"type": "string",
"examples": ["javaScript", "object-C", "C++","swift","php"]
}
},
"car": {
"type": "object",
"required": ["type","number", "price"],
"properties": {
"type": {
"type": "string",
"examples": ["A"]
},
"number": {
"type": "string",
"examples": ["粤A 66666"]
},
"price": {
"type": "number",
"examples": [21344.88 ]
}
}
}
}
}

推荐使用命令行工具的validate模块来使用Schema对准备好的JSON文档进行校验,列出执行细节:

wendingding$ npm install -g ujs-jsonvalidate
/usr/local/bin/validaten -> /usr/local/lib/node_modules/ujs-jsonvalidate/bin/validaten
/usr/local/bin/validate -> /usr/local/lib/node_modules/ujs-jsonvalidate/bin/validate
+ ujs-jsonvalidate@0.1.2
added 4 packages in 7.353s
wendingding$ validate demo.json demo-schema.json
JSON content in file demo.json is valid

因为在Schema文档中name字段是必要的,这里尝试删除demo.json文档中的name:"wendingding"部分,然后重新执行校验会发现提示错误信息。

wendingding$ cat demo.json
{
"age": 18,
"email": "wendingding_ios@126.com",
"height": 1.73,
"isGoodMan": true,
"tags": [
"javaScript",
"object-C",
"C++",
"swift",
"php"
],
"car": {
"type": "A",
"number": "粤A 66666",
"price": 21344.88
}
}
wendingding$ validate demo.json demo-schema.json
Invalid: Missing required property: name
JSON Schema element: /required/0
JSON Content path:

核心关系词说明

type 声明对应字段的类型。

pattern 使用正则表达式来限定字段的值。

properties 声明对象中的字段,其中包含具体字段的type值等信息。

$schema 声明遵循的JSON Schema标准版本,校验文档时使用该版本的规则。

items 如果字段是数组类型(array),那么对数组元素的类型等进行限定。

minimum | maximum 如果是数值类型(number),那么限定其取值的范围。

minItems | maxItems 用于校验数组成员的数目,设定最小数目和最大数目。

examples 提供该字段对应值的示例,在创建schema文档的时候通常根据JSON模板文件的内容生成。

enum 定义固定的枚举值来限制数组元素的取值,即数组的元素值只能是enum限定集合中的数据。

additionalProperties 将该字段设置为false可以禁止JSON文档当前节点中出现额外的字段。

required 该数组用于声明JSON文档中所有的必需字段,即必需包含这些字段,否则视为非法文档。

dependencies 设置字段的依赖关系,即JSON文档中出现了某个字段的出现必须依赖某个特定字段。

patternProperties 模式属性可以基于正则表达式来声明部分重复的字段名,如^string[1-3]$

在工作中如果需要对JSON数据进行严格的语法和语义校验,那么建议先使用典型的JSON文档利用[JSON Schema在线工具](http://json-schema.org)自动生成对应的Schema校验文件,然后再对该文件进行二次编辑,这样效率会更高一些。

这里给出JSON Schema在线工具的使用示例。

扩展 前文中在对JSON文档和对应Schema进行校验的时候,在命令行中使用的是validate模块,该模块是JSON Validate网站所对应的npm包,具体使用的是名为ujs-jsonvalidate的处理器。此外,ajv也是Node中优秀的一款JSON校验类库,它本身很简洁且兼容性很好,更多信息可以参考链接地址。

前端开发系列022-基础篇之JavaScript和JSON(进阶)的更多相关文章

  1. 前端开发【第4篇:JavaScript基础】

    JavaScript简述 上一篇文章已经聊过JavaScript的历史了这里不再复述了直接切入正题,JavaScript是一门解释型.动态类型.弱类型语言. 解释型语言和编译型语言就类似看一本书,编译 ...

  2. 前端开发【第3篇:JavaScript序】

    JavaScript历史 聊聊JavaScript的诞生 JavaScirpt鼻祖:Bremdan Eich(布兰登·艾奇),JavaScript的诞生于浏览器的鼻祖网景公司(Netscape),发布 ...

  3. 前端开发【第6篇:JavaScript客户端(浏览器)】

    Web浏览器中的JavaScript 客户端JavaScript时间线 1.Web浏览器创建Document对象,并且开始解析web页面,解析HTML元素和它门的文本内容后添加Element对象和Te ...

  4. 前端开发【第5篇:JavaScript进阶】

    语句 复合表达式和空语句 复合表达式意思是把多条表达式连接在一起形成一个表达式 { let a = 100; let b = 200; let c = a + b; } 注意这里不能再块级后面加分号, ...

  5. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)

    背景 ​ 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...

  6. 前端开发:css基础知识之盒模型以及浮动布局。

    前端开发:css基础知识之盒模型以及浮动布局 前言 楼主的蛮多朋友最近都在学习html5,他们都会问到同一个问题 浮动是什么东西?  为什么这个浮动没有效果?  这个问题楼主已经回答了n遍.今天则是把 ...

  7. ESP8266开发之旅 基础篇① 走进ESP8266的世界

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  9. ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  10. openlayers5-webpack 入门开发系列一初探篇(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

随机推荐

  1. react项目vite报错:UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token '??='

    问题: vite报错:UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token '??=' 今天clone一个vite的项目,安装 ...

  2. Golang从0到1实现简易版expired LRU cache带图解

    1.支持Put.Get的LRU实现 想要实现一个带过期时间的LRU,从易到难,我们需要先学会如何实现一个普通的LRU,做到O(1)的Get.Put. 想要做到O(1)的Get,我们很容易想到使用哈希表 ...

  3. 有的时候,需要利用UserControl占位模板,动态替换的情况,绑定后无法获取DataContext的问题

    有的时候,需要利用UserControl占位模板,动态替换的情况,绑定后无法获取DataContext的问题,特此备注下 效果如下: 关键的地方是,下面第3行,需要把当前的上下文传递到Content, ...

  4. mysql重新设置密码、远程登录及中文乱码修改

    基础环境 版本:mysql 5.7.33 系统:ubuntun0.18.04 一.忘记密码问题 1.编辑配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,注意此为ubunt ...

  5. Spring Bean元数据体系与Spring容器

    >>>点击去看B站配套视频<<< 系列文章目录和关于我 1. 从一个例子开始 小陈申请加盟咖啡店后,小陈收到总部寄来的<开店规格单>.这份文件允许每家分 ...

  6. 【记录】ChatGPT|图片预览魔法咒语魔改,使用 ChatGPT 返回大量可以跳转的链接

    很早的时候,我已经留意到 ChatGPT 会以返回图片的 markdown 格式来显示图片,很可能拥有一定的图片上传功能,但是它往往会显示得有些问题.一些代码图片之类的或者风景图什么的都不是很会. 但 ...

  7. HarmonyOS NEXT开发实战教程-记账app

    今天分享的实战教程是一款记账app,最近分享的项目都是纯页面,没有服务端,没有数据接口,因为鸿蒙开发主要就是写页面,都是前端嘛.如果有友友想要完整的项目可以找幽蓝君定制,想学服务端开发的话幽蓝君也可以 ...

  8. P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces题解

    题意: 给定一个长度为 \(n=2^k\) 的数组 \(a\),下标从 \(0\) 开始,维护 \(m\) 次操作: 给定 \(x\),设数列 \(a'\) 满足 \(a'_i=a_{i\oplus ...

  9. vue3 基础-插件 plugin

    前几篇我们介绍了 mixin 混入的的方式能实现对代码的复用, 而本篇将要介绍的 plugin 将会更加适合这种通用性功能的代码的复用和扩展. 最常用的场景, 比如轮播图就非常实用 plugin 来实 ...

  10. 解决ZYNQ-7020开发板使用vitis编译uboot报错和无法正常调试的问题

    整个学习过程是参考正点原子启明星开发板的2020.2版本嵌入式Linux开发指南,在学习uboot移植的时候遇到了问题. 新建工程和配置环境啥的和教程里都一样,就不罗嗦了,这里重点讲和教程不一样的地方 ...