二、JSON 入门

JSON 或 JavaScript 对象符号是一种非常流行的数据交换格式。它是由道格拉斯·克洛克福特开发的。JSON 是基于文本的、轻量级的,并且是一种人类可读的格式,用于客户端和服务器之间的数据交换。JSON 是从 JavaScript 派生出来的,与 JavaScript 对象非常相似,但并不依赖于 JavaScript。JSON 是独立于语言的,所有流行的语言都支持 JSON 数据格式,其中一些是 C#、PHP、Java、C++、Python 和 Ruby。

JSON 是一种格式,而不是一种语言。

JSON 可以在网络应用中用于数据传输。在 JSON 之前,XML 被认为是被选择的数据交换格式。XML 解析需要客户端的 XML DOM 实现来接收 XML 响应,然后使用 XPath 来查询响应,以便访问和检索数据。这使得生活变得乏味,因为查询数据必须在两个级别上执行:第一次是在服务器端,从数据库中查询数据,第二次是在客户端使用 XPath。JSON 不需要任何特定的实现;浏览器中的 JavaScript 引擎处理 JSON 解析。

XML 消息通常会很沉重和冗长,并且在通过网络连接发送数据时会占用大量带宽。一旦检索到 XML 消息,就必须将其加载到内存中进行解析;让我们来看看一个用 XML 和 JSON 表示的students数据提要。

以下是一个 XML 示例:

Getting Started with JSON

让我们来看看 JSON 中的例子:

Getting Started with JSON

正如我们注意到的,与 JSON 消息相比,XML 消息的大小更大,这只是针对两个记录。实时提要将以几千个开始,然后向上。另一点需要注意的是,必须由服务器生成然后通过互联网传输的数据量已经很大了,而冗长的 XML 使它变得更大。鉴于我们正处于智能手机和平板电脑日益普及的移动设备时代,在速度较慢的网络上传输如此大量的数据会导致页面加载缓慢、挂起和用户体验不佳,从而导致用户远离网站。为了避免前面提到的问题,JSON 已经成为首选的互联网数据交换格式。

由于 JSON 用于在互联网上传输序列化数据,我们需要记下它的 MIME 类型。A MIME ( 多用途互联网邮件扩展)类型是一种互联网媒体类型,它是通过互联网传输的内容的两部分标识符。MIME 类型通过 HTTP 请求和 HTTP 响应的 HTTP 头传递。MIME 类型是服务器和浏览器之间的内容类型通信。一般来说,一个 MIME 类型将有两个或多个部分,为浏览器提供关于在 HTTP 请求或 HTTP 响应中发送的数据类型的信息。JSON 数据的 MIME 类型为application/json。如果 MIME 类型头没有通过浏览器发送,它会将传入的 JSON 视为纯文本。

【JSON 的《你好世界》节目

既然我们已经对 JSON 有了基本的理解,让我们继续我们的 Hello World 程序。这显示在下面的截图中:

The Hello World program with JSON

当从浏览器调用之前的程序时,它会在屏幕上提醒世界。让我们密切关注<script>标签之间的脚本。

The Hello World program with JSON

在第一步中,我们创建一个 JavaScript 变量,并用一个 JavaScript 对象初始化该变量。类似于我们从 JavaScript 对象中检索数据,我们使用键值对来检索值。简单来说,JSON 是键和值对的集合,其中每个键都是对的引用,T0 是值存储在计算机上的存储位置。现在让我们后退一步,分析为什么我们需要 JSON,如果我们所做的只是分配容易获得的 JavaScript 对象。答案是,JSON 是一种完全不同的格式,不像 JavaScript 那样是一种语言。

JSON 键和值必须用双引号括起来,如果任何一个都用单引号括起来,我们将收到一个错误。

现在,让我们快速看看 JSON 和普通 JavaScript 对象之间的相似之处和不同之处。如果我们要创建一个类似于前面例子中的hello_world JSON 变量的 JavaScript 对象,它看起来像下面的 JavaScript 对象:

The Hello World program with JSON

这里最大的区别是密钥没有用双引号括起来。由于 JSON 键是一个字符串,我们可以使用任何有效的字符串作为键。我们可以在键中使用空格、特殊字符和连字符,这在普通的 JavaScript 对象中是无效的。

The Hello World program with JSON

当我们在密钥中使用特殊字符、连字符或空格时,我们在访问它们时必须小心。

The Hello World program with JSON

前面的 JavaScript 语句不起作用的原因是 JavaScript 不接受带有特殊字符、连字符或字符串的键。因此,我们必须使用一种方法来检索数据,在这种方法中,我们将 JSON 对象作为带有字符串键的关联数组来处理。这显示在下面的截图中:

The Hello World program with JSON

两者之间的另一个区别是,一个 JavaScript 对象可以在其中携带函数,而一个 JSON 对象不能携带任何函数。下面的例子有属性getName,它有一个函数在被调用时提醒名字John Doe:

The Hello World program with JSON

最后,最大的区别是,一个 JavaScript 对象从来就不是数据交换格式,而 JSON 的唯一目的是将其用作数据交换格式。

JSON 中的数据类型

现在,让我们看一个更复杂的 JSON 例子。我们还将检查受 JSON 支持的所有数据类型。JSON 支持六种数据类型:字符串、数字、布尔值、数组、对象和空值。

Datatypes in JSON

在前面的例子中,我们有五个不同数据类型的键值对。现在让我们仔细看看这些键值对:

Datatypes in JSON

"id" 引用的值的数据类型是一个数字。

Datatypes in JSON

这里,"name" 引用的值的数据类型是一个字符串。

Datatypes in JSON

在前面的截图中,"isStudent"引用的值的数据类型是一个布尔值。

Datatypes in JSON

这里"scores"引用的值的数据类型是一个数组。

Datatypes in JSON

这里"courses"引用的值的数据类型是一个对象。

我们知道 JSON 支持六种数据类型;它们是字符串、数字、布尔值、数组、对象和 null。是的,JSON 支持空数据,实时业务实现需要准确的信息。可能会有空字符串替换为 null 的情况,但这是不准确的。让我们快速看一下下面的例子:

Datatypes in JSON

数组和空值是 JavaScript 中的对象。

在前面的例子中,我们使用了typeof运算符,该运算符接受一个操作数,并返回该操作数的数据类型。在第 4 行,我们确定空字符串的类型,而在第 8 行,我们确定空值的类型。

现在,让我们在一个页面中实现我们的 JSON 对象并检索值,如下面的截图所示:

Datatypes in JSON

要从变量complexJson中检索id ,我们需要执行以下操作:

Datatypes in JSON

要从变量complexJson中检索name,请查看显示的截图:

Datatypes in JSON

看下面的截图从变量complexJson中检索isStudent:

Datatypes in JSON

从数组和对象中检索数据有点棘手,因为我们必须遍历数组或对象。让我们看看如何从数组中检索值:

Datatypes in JSON

在前面的例子中,我们正在从scores数组中检索第二个元素。虽然scorescomplexJson对象内部的一个数组,但它仍然被视为一个常规的键值对。当访问密钥时,处理方式不同;当访问一个键时,解释器必须评估的第一件事是获取其值的数据类型。如果检索到的值是字符串、数字、布尔值或空值,则不会对该值执行任何额外的操作。但是如果它是一个数组或者一个对象,这个值的依赖关系就被考虑进去了。

要从 JSON 对象内部的对象中检索元素,我们必须访问作为该值引用的键,如图所示:

Datatypes in JSON

由于对象没有数字索引,JavaScript 可能会重新排列对象内部的项目顺序。如果你注意到 JSON 对象初始化时的键值对顺序和你访问数据时不同,那就没什么好担心的了。没有数据丢失;JavaScript 引擎刚刚对您的对象进行了重新排序。

支持 JSON 的语言

到目前为止,我们已经看到了 JavaScript 中的解析器是如何支持 JSON 的。还有许多其他编程语言为 JSON 提供实现。PHP、Python、C#、C++和 Java 等语言为 JSON 数据交换格式提供了非常好的支持。所有支持面向服务架构的流行编程语言都已经理解了 JSON 及其实现对于数据传输的重要性,因此,它们为 JSON 提供了巨大的支持。让我们绕过用 JavaScript 实现 JSON,看看 JSON 是如何用其他语言实现的,比如 PHP 和 Python。

PHP

PHP 被认为是构建网络应用最流行的语言之一。它是一种服务器端脚本语言,允许开发人员构建可以在服务器上执行操作的应用,连接到数据库以执行 CRUD(创建、读取、更新、删除)操作,并为实时应用提供庄严的环境。 JSON 支持已经从 PHP 5.2.0 内置到 PHP 核心中;这有助于用户避免进行任何复杂的安装或配置。鉴于 JSON 只是一种数据交换格式,PHP 由两个函数组成。这些函数处理通过请求进入的 JSON,或者生成将通过响应发送的 JSON。PHP 是弱类型语言;对于这个例子,我们将使用存储在 PHP 数组中的数据,并将该数据转换为 JSON 字符串,该字符串可以用作数据馈送。让我们重新创建我们在前面部分中使用的学生示例,用 PHP 构建它,并将其转换为 JSON。

这个例子只是为了向您展示如何使用 PHP 生成 JSON。

PHP

要运行一个 PHP 脚本,我们需要安装 PHP。要通过浏览器运行 PHP 脚本,我们需要一个 web 服务器,比如 Apache 或 IIS。当我们使用 AJAX 时,我们将使用 JSON 数据完成第 4 章AJAX 调用中的安装。

这个脚本首先初始化一个变量,并分配一个包含学生信息的关联数组。然后将变量$students传递给一个名为 json_encode()的函数,该函数将变量转换为 JSON 字符串。当这个脚本运行时,它生成一个有效的响应,该响应可以作为 JSON 数据馈送提供给其他应用使用。

输出如下:

PHP

我们通过一个简单的 PHP 脚本成功地生成了我们的第一个 JSON 提要;让我们看一下解析通过 HTTP 请求进入的 JSON 的方法。发出异步 HTTP 请求以 JSON 格式发送数据的 web 应用很常见。

这个例子只是为了向您展示如何将 JSON 摄入到 PHP 中。

PHP

输出如下所示:

PHP

蟒蛇

Python 是一种非常流行的脚本语言,广泛用于执行字符串操作和构建控制台应用。它可以用来从 JSON API 中获取数据,一旦检索到 JSON 数据,它将被视为 JSON 字符串。为了对该 JSON 字符串执行任何操作,Python 提供了 JSON 模块。JSON 模块融合了许多强大的函数,我们可以用它们来解析手头的 JSON 字符串。

这个例子只是为了向你展示如何使用 Python 生成 JSON。

Python

在这个例子中,我们使用了复杂的数据类型,如元组和字典,分别存储分数和课程;既然这不是 Python 课程,我们就不深入这些数据类型了。

要运行这个脚本,需要安装 Python2,它预装在任何*nix 操作系统上。

输出如下:

Python

键可能会根据数据类型进行重新排列;我们可以使用sort_keys标志来检索原始订单。

现在,让我们快速看看 JSON 解码是如何在 Python 中执行的。

这个例子只是为了向您展示如何将 JSON 摄入 Python。

Python

在本例中,我们将 JSON 字符串存储在student_json中,并使用通过 Python 中的 JSON 模块提供的方法。

输出如下:

Python

总结

本章向我们介绍了 JSON 的基础知识。我们回顾了 JSON 的历史,了解了它相对于 XML 的优势。我们创建了第一个 JSON 对象,并成功解析了它。此外,我们研究了 JSON 支持的所有数据类型。最后,我们看了一些关于如何用其他编程语言实现 JSON 的例子。当我们在这个旅程中前进时,我们会发现我们在本章中收集的知识是我们将在后面几章中讨论的更复杂概念的坚实基础。