第 1 章 什么是 JSON

第 1 章 什么是JSON

在深入讨论 JSON 之前,先让我们对它有一个感性的认识。宏观上看,JSON 是一种轻量的数据格式,在各种地方传递数据。如果单用眼睛看,JSON 里的数据是被保存在花括号({})中的,而如果从用途上进一步分析,最终我们会得出结论:JSON 是一种数据交换格式。

1.1 JSON是一种数据交换格式

数据交换格式是一种在不同平台间传递数据的文本格式。除 JSON 外,你也可能听说过 XML 这种数据交换格式。像 XML 和 JSON 这样的数据交换格式非常重要,我们需要它们来实现不同系统间的数据交换。

举个例子,假如有这样一个世界,它由数百个散布在海洋中的小岛所组成。每个海岛都是相互独立的,并有自己独特的语言和习俗。这些岛上都有许多商人,他们需要在海岛间进行长途航行。这种对外贸易是所有海岛经济必需的组成部分,也有助于提高岛民的生活水平。而这一切的实现都要归功于那些训练有素的送信海鸥。

这些海鸥在岛间飞行,携带着需求量最大的货物的信息。商人根据这些信息来决定他们的下一站,以及在长途航行前应储备哪些货物。也正是凭借这些关键的数据,各个海岛间才可以互通有无,共同繁荣。

别忘了,每个海岛的语言都不同。如果这些信息用各种不同的语言编写,那么每个海岛都要花上一大笔钱来研究各种语言,并组建一支翻译团队。这既昂贵,又费时。不过岛民们十分聪明,他们决定统一使用一种语言,用一种标准的数据格式来传达贸易数据。这样,每个海岛都只需雇用一个懂得这一数据格式的翻译就好了,由他们来解读海鸥带来的贸易报告。

这个海岛的例子其实就映射出了我们在实际生活中所使用的技术。我们的生活中充满了各种系统,它们所使用的语言和架构都不尽相同。而对于使用这些系统的企业和组织来说,它们之间相互通信的能力又是不可或缺的。但如果每一个系统都必须有一个专门针对其他所有系统的数据组织形式的翻译组件,那么它们之间的交流便要消耗许多时间和资源,这显然是不合理的。所以,这些系统间也需要一种单一的数据格式,以及单一的翻译组件。

JSON 就是这样一种被许多系统用于交换数据的数据交换格式。有人把它叫作“数据交换格式”,甚至直接叫“数据格式”。在本书中,我们把 JSON 看作一种数据交换格式,是因为“交换”往往意味着两个或多个实体之间的相互交流。

然而,不是所有的系统都支持使用 JSON 来交换数据。数据交换格式有很多,如前面提到的 XML(extensible markup language,可扩展性标记语言),可能早在 JSON 被发明前就已经在应用了。毕竟现实世界不会像例子中的海岛世界那么简单。有许多系统可以并还在使用像 XML 这样的格式,或是用表格和分隔符来表示数据的格式,如逗号分隔值(CSV)。现实中的每个“海岛”所选择的数据交换格式,也通常会和数据格式与“海岛”的风俗、语言、建筑结构等因素间的联系相挂钩。

示例中的海岛世界里,每一个海岛都有它自己的语言。而海鸥所传送的报告上的数据所用的格式,是一种与语言无关的格式。这使得每个岛只需要雇用一个解释贸易报告的翻译即可。JSON 也一样,只不过数据不是通过海鸥传送的,而是通过网络中的 0 和 1 这样的信号传送。翻译自然也不是人,而是系统的一个解析器,用于将数据转换为系统可以读取的形式。

1.2 JSON独立于编程语言

JSON 的全称是 JavaScript Object Notation(JavaScript 对象表示法)。这个名字可能会让人误以为要想理解和使用 JSON,得先学习 JavaScript。诚然,在学习 JSON 前学一点 JavaScript 肯定会有帮助,毕竟 JSON 源于 JavaScript 的一个子集。但如果你以后用不到 JavaScript,那也没有必要去学习它,因为数据交换格式是独立于语言的。你仍可以在你自己的系统中使用你自己的语言。

JSON 基于 JavaScript 对象字面量。关于“如何”使用 JSON,更适合在关于句法(第 2 章)和数据类型(第 3 章)的章节讨论。这一章中最重要的还是讨论“为什么”。既然数据交换格式需要独立于语言,那么 JSON 不仅源于一门语言,还在名字中给这种语言打广告,这是否有些自相矛盾?为什么?

回到海岛的例子,想象一下众海岛代表开会决定数据格式时是怎样一种情形。当数以百计的海岛代表们前来参会,并尝试创造一种数据格式的时候,他们要做的第一件事就是寻找共同点。

每一个海岛的语言也许都是独一无二的,但是海岛居民们也会在其中发现共同点。绝大多数语言都由人来发声,并包含一种由某种字符组成的书面语言形式。此外,大多数语言还都有面部表情和手势。也许有一些海岛的居民使用其他的方式来沟通,如敲击木棒或是眨眼睛,不过大多数海岛都会在其语言的口语形式和书面形式中找出相同点。

现实世界中同样有着数以百计的编程语言。虽然有一些非常流行且广泛使用的语言,但是语言大家族整体是多样化的。当大学生们选择计算机科学专业,为编程生涯做准备时,他们不会学习所有的语言。他们一般会从一门语言开始学习,而且语言的选择并没有学习编程中通用的概念重要。一旦他们掌握了这些概念,学习另一门编程语言时就会轻松很多,因为他们已经有能力分辨那些共有的特征和功能。

再来看看 JSON,如果我们将“JavaScript 对象表示法”中的“JavaScript”去掉,剩下的就是“对象表示法”。所以忘了 JavaScript 吧。可以说,我们使用的是一种基于对象表示法的数据交换格式。而“对象”在编程中,尤其是在面向对象编程(OOP)中,是很常见的概念。绝大多数计算机科学专业的学生都会在学习编程时接触到对象的概念。

我们不过多地解释对象,而是把重点放到“表示法”上。表示法是指一个可以表示诸如数字或单词等数据的字符系统。不管你是否理解什么是对象,都不难看出用某个符号去描述编程语言中共有概念的价值所在。

再回到海岛的例子,岛民们发现了一种出现在大多数语言中的表示法。举例来说,许多岛民都使用计数算筹来表示数字,具体用法也大多类似;同时,他们也都能理解一些表示生活中常见事物(如小麦或布)的符号。甚至那些用眨眼来交流的岛民都能接受这种格式。

尽管大部分海岛之间达成了共识,仍有一小部分海岛,比如那个通过敲击木棒来交流的海岛,发现他们不能理解这种格式。一种好的数据交换格式必然要适用于大多数系统,但也常常会有小部分不适用的系统。这时我们常会用到一个术语:可移植性。可移植性,或者说在平台和系统间传输信息的兼容性,是一种数据交换格式所追求的一个重要指标。

回到表示法这一概念上,虽说 JSON 这一表示法起源于 JavaScript,但是真正重要的是表示法本身。JSON 不仅独立于语言,而且使用了一种在许多编程语言中都能找到共同元素的表达方式。通过这种表达数据的方式,即便是那些不支持面向对象编程的语言,也会发现 JSON 这种格式是可以接受的。

1.3 专业术语和概念

本章涵盖了以下专业术语。

  • JSON

    JavaScript 对象表示法(JavaScript Object Notation)。

  • 表示法

    一个用于表示诸如数字或单词等数据的字符系统。

  • 数据交换格式

    用于在不同的平台或系统间交换数据的文本。

  • 可移植性

    以一种对双方系统都兼容的方式在平台间传递信息。

我们还讨论了以下重要概念。

  • JSON 是一种数据交换格式。

  • JSON 独立于编程语言(你不必先学习 JavaScript)。

  • JSON 基于 JavaScript 对象字面量表示法(重点在于“表示法”)。

  • JSON 表达数据的方式对通用的编程概念都很友好。

目录

  • 版权声明
  • O'Reilly Media, Inc. 介绍
  • 前言
  • 第 1 章 什么是 JSON
  • 第 2 章 JSON 语法
  • 第 3 章 JSON 的数据类型
  • 第 4 章 JSON Schema
  • 第 5 章 JSON 中的安全问题
  • 第 6 章 JavaScript 中的 XMLHttpRequest 与 Web API
  • 第 7 章 JSON 与客户端框架
  • 第 8 章 JSON 与 NoSQL
  • 第 9 章 服务端的 JSON
  • 第 10 章 总结
  • 作者简介
  • 封面介绍