JSON 作为目前 web 主流的数据交换格式, 是每个 IT 技术人员都必须要了解的一种数据交换格式. 尤其是在 Ajax 和 REST 技术的大行其道的当今, JSON 无疑成为了数据交换格式的首选!
今天大家就和猪哥一起来学习一下 JSON 的相关知识吧!
一, xml
在讲 JSON 之前, 我觉得有必要先带大家了解一下 xml(Extensible Markup Language 可扩展标记语言), 因为 JSON 正在慢慢取代 xml.
1.xml 起源
早期 Web 发展和负载的数据量并不是很大, 所以基本靠 html(1989 诞生)可以解决. 但是随着 Web 应用的不断壮大, HTML 的一些缺点也慢慢显现, 如: 可读性差, 解析时间长, 数据描述性差等.
1998 年 2 月 10 日, W3C(World WideⅥiebConsortium, 万维网联盟)公布 xml 1.0 标准, xml 诞生了.
xml 使用一个简单而又灵活的标准格式, 为基于 Web 的应用提供了一个描述数据和交换数据的有效手段. 但是, xml 并非是用来取代 HTML 的. HTML 着重如何描述将文件显示在浏览器中, 它着重描述如何将数据以结构化方式表示.
xml 简单易于在任何应用程序中读 / 写数据, 这使 xml 很快成为数据交换的唯一公共语言, 所以 xml 被广泛应用.
注意: xml 是一种数据交换的格式, 并不是编程语言. 而且他是跨语言的数据格式, 目前绝大多数编程语言均支持 xml.
2.xml 实例
xml 究竟怎么用? 是什么样子的? 我们来举一个简单的例子吧!
A 公司要和 B 公司业务对接(A 公司要获取 B 公司的用户基本信息),B 公司提供接口让 A 公司调用, A,B 公司对接的开发人员会提前沟通好这个接口的: URL, 传参, 返回数据, 异常等等.
但是也许两个公司使用的技术栈并不相同, 所以支持的据格式也可能不同. 为了解决因技术栈不同带来的数据格式不同问题, A,B 公司的开发协商使用一种通用的数据格式来传输, 于是他们想到了 xml.
假设现在 A 公司需要名称叫 pig 的用户信息, 于是 A 公司调用 B 公司的接口, 并传参数 name=pig.
然后 B 公司接口收到请求后, 将用户信息从数据库拿出来, 然后封装成下面的 xml 格式, 然后再返回给 A 公司.
最后 A 公司收到返回后, 使用 xml 库解析数据即可
- <?xml version="1.0" encoding="UTF-8"?>
- <person>
- <name>pig</name>
- <age>18</age>
- <sex>man</sex>
- <hometown>
- <province > 江西省</province>
- <city > 抚州市</city>
- <county > 崇仁县</county>
- </hometown>
- </person>
3.xml 十字路口
虽然 xml 标准本身简单, 但与 xml 相关的标准却种类繁多, W3C 制定的相关标准就有二十多个, 采用 xml 制定的重要的电子商务标准就有十多个. 这给软件开发工程师带来了极大的麻烦!
随着 Ajax(之前叫 XMLHTTP,2005 年后才叫 Ajax)技术的流行, xml 的弊端也越来越显现: 大家都知道 xml 实现是基于 DOM 树实现的, 而 DOM 在各种浏览器中的实现细节不尽相同, 所以 xml 的跨浏览器兼容性并不好, 所以急需一种新的数据负载格式集成到 HTML 页面中以满足 Ajax 的要求!
二, JSON
前面我们说了随着 Ajax 的流行, 而各种浏览器对 DOM 的实现细节不尽相同, 所以会出现兼容性问题, 这对前端开发同学来讲真的是灾难. 因为一个功能可能需要用代码去兼容各种不同的浏览器, 还要调试, 工作量巨大.
1.JSON 诞生
如何才能将数据整合到 HTML 中又解决浏览器兼容性问题呢? 答案就是: 利用所有主流浏览器中的一种通用组件 --JavaScript 引擎. 这样只要创造一种 JavaScript 引擎能识别的数据格式就可以啦!
2001 年 4 月, 首个 JSON 格式的消息被发送出来. 此消息是从旧金山湾区某车库的一台计算机发出的, 这是计算机历史上重要的的时刻. 道格拉斯. 克罗克福特(Douglas Crockford) 和 奇普. 莫宁斯达(Chip Morningstar) 是一家名为 State Software 的技术咨询公司的联合创始人(后来都在雅虎任职), 他们当时聚集在 Morningstar 的车库里测试某个想法, 发出了此消息.
- document.domain = 'fudco';
- parent.session.receive(
- { to: "session", do: "test", text: "Hello world" }
- )
熟悉 JS 的同学是不是也很惊讶, 第一个 JSON 消息它明显就是 JavaScript! 实际上, Crockford 自己也说过他不是第一个这样做的人. 网景 (Netscape ) 公司的某人早在 1996 年就使用 JavaScript 数组字面量来交换信息. 因为消息就是 JavaScript, 其不需要任何特殊解析工作, JavaScript 解释器就可搞定一切.
最初的 JSON 信息实际上与 JavaScript 解释器发生了冲突. JavaScript 保留了大量的关键字(ECMAScript 6 版本就有 64 个保留字),Crockford 和 Morningstar 无意中在其 JSON 中使用了一个保留字: do. 因为 JavaScript 使用的保留字太多了, 所以 Crockford 决定: 既然不可避免的要使用到这些保留字, 那就要求所有的 JSON 键名都加上引号. 被引起来的键名会被 JavaScript 解释器识别成字符串. 这就为什么今天 JSON 键名都要用引号引起来的原因.
这种数据格式既然可以被 JavaScript 引擎识别, 那就解决了 xml 带来的各种浏览器兼容性问题, 所以这种技术完全可以推广出去, 于是 Crockford 和 Morningstar 想给其命名为 "JSML", 表示 JavaScript 标记语言 (JavaScript Markup Language) 的意思, 但发现这个缩写已经被一个名为 Java Speech 标记语言的东西所使用了. 所以他们决定采用 "JavaScript Object Notation", 缩写为 JSON, 至此 JSON 正式诞生.
2.JSON 发展
2005 年, JSON 有了一次大爆发. 那一年, 一位名叫 Jesse James Garrett 的网页设计师和开发者在博客文章中创造了 "AJAX" 一词. 他很谨慎地强调: Ajax 并不是新技术, 而是 "好几种蓬勃发展的技术以某种强大的新方式汇集在一起." Ajax 是 Garrett 给这种正受到青睐的 Web 应用程序的新开发方法的命名. 他的博客文章接着描述了开发人员如何利用 JavaScript 和 XMLHttpRequest 构建新型应用程序, 这些应用程序比传统的网页更具响应性和状态性. 他还以 Gmail 和 Flickr 网站已经使用 Ajax 技术作为了例子.
当然了,"AJAX" 中的 "X" 代表 xml. 但在随后的问答帖子中, Garrett 指出, JSON 可以完全替代 xml. 他写道:"虽然 XML 是 AJAX 客户端进行数据输入, 输出的最完善的技术, 但要实现同样的效果, 也可以使用像 JavaScript Object Notation(JSON)或任何类似的结构数据方法等技术."
这时 JSON 便在国外的博客圈, 技术圈慢慢流行起来!
2006 年, Dave Winer, 一位高产的博主, 他也是许多基于 xml 的技术 (如 RSS 和 xml-RPC) 背后的开发工程师, 他抱怨到 JSON 毫无疑问的正在重新发明 xml.
Crockford 阅读了 Winer 的这篇文章并留下了评论. 为了回应 JSON 重新发明 xml 的指责, Crockford 写到:"重造轮子的好处是可以得到一个更好的轮子".
3.JSON 实例
还是以上面 A,B 公司业务对接为例子, 两边的开发人员协商一种通用的数据交换格式, 现在有 xml 与 JSON 比较流行的两种数据格式, 于是开发人员又将用户信息以 JSON 形式展现出来, 然后比较两种数据格式:
- {
- "person": {
- "name": "pig",
- "age": "18",
- "sex": "man",
- "hometown": {
- "province": "江西省",
- "city": "抚州市",
- "county": "崇仁县"
- }
- }
- }
比较 xml 与 JSON 的数据格式之后, 开发人员发现: JSON 可阅读性, 简易性更好而且相同数据负载 JSON 字符数更少, 所以两个开发人员一致同意使用 JSON 作为接口数据格式!
而且还有重要的一点, 在编写 xml 时, 第一行需要定义 xml 的版本, 而 JSON 不存在版本问题, 格式永远不变!
4. 当今 JSON 地位
当今的 JSON 已经占领了全世界. 绝大多数的应用程序彼此通过互联网通信时, 都在使用 JSON. 它已被所有大型企业所采用: 十大最受欢迎的 Web API 接口列表中(主要由 Google,Facebook 和 Twitter 提供), 仅仅只有一个 API 接口是以 xml 的格式开放数据的.
JSON 也在程序编码级别和文件存储上被广泛采用: 在 Stack Overflow 上, 关于 JSON 的问题越来越多, 下图是关于 Stack Overflow 上不同数据交换格式的问题数和时间的曲线关系图.
从上图我们可以看出在 Stack Overflow 上越来越多 JSON 的问题, 从这里也可以反映出 JSON 越来越流行!
更详细的关于创造 JSON 的故事可阅读: https://www.jianshu.com/p/62a856367d2d
3, 总结
由于篇幅原因我们今天只学习了 JSON 的诞生和起源相关知识, 知道了 JSON 的诞生是因为 xml 无法满足 Ajax 对浏览器兼容性问题, 所以就有人想创造一种浏览器通用组件: JavaScript 引擎 能识别的数据格式, 这样就可以解决浏览器不兼容问题, 所以就从 JS 数据格式中提取了一个子集, 取名为 JSON!
我们还知道了为什么 JSON 键为什么需要用双引号引起来, 是因为 JS 中存在许多的关键字和保留关键字, 为了避免与 JS 关键字冲突, 所以 Crockford 就要求在所有的键名上加上双引号, 这样 JS 引擎会将其识别为字符串, 就避免与 JS 中关键字冲突!
下期我们会详细介绍 JSON 数据结构, JSON 序列化, JSON 在 Python 中的使用等知识.
了解技术诞生与发展背后的故事同样重要, 因为这些可以作为你吹逼的资本!
参考资料:
百度百科: xml
Daniel Rubio:JSON 简介
https://www.jianshu.com/p/62a856367d2d
来源: https://www.cnblogs.com/pig66/p/11933275.html