Skip to main content

JSON 简介

作者 Lisa Tagliaferri

导言

JSONJavaScript Object Notation(JavaScript 对象表示法)的缩写,是一种分享数据的格式。顾名思义,JSON 来源于 JavaScript 编程语言,但它可以被许多语言使用,包括 Python、Ruby、PHP 和 Java。JSON的发音就像“Jason”这个名字。 JSON 是可读的、轻量级的,可以很好地替代 XML,而且对格式化的要求也更低。本指南将讨论你可以在 JSON 文件中使用的数据,以及这种格式的一般结构和语法。

了解语法和结构

JSON 单独存在时,使用 .json 扩展名,当它在另一种文件格式(如 .html)中被定义时,它可以作为 JSON 字符串出现在引号内,也可以作为对象分配给一个变量。这种格式在网络服务器和客户端/浏览器之间进行传输。 JSON 对象 是一种键值数据格式,通常用大括号呈现。当你工作中需要用到 JSON 时,你可能会在 .json 文件中遇到 JSON 对象,它们也可以作为一个 JSON 对象或字符串存在于一个程序的上下文中。 以下是一个 JSON 对象的示例:

{
"first_name" : "Sammy",
"last_name" : "Shark",
"location" : "Ocean",
"online" : true,
"followers" : 987
}

这个例子很简短,实际上 JSON 可以有很多行。格式一般是在两端有两个大括号,用 { } 表示,中间的空间用键值对填充。大多数在 JSON 中使用的数据最终都被封装在一个 JSON 对象中。 键值对 之间有一个冒号,如 ”key" : "value"。每个键值对之间用逗号隔开,所以JSON中间的列表如下:"key" : "value", "key" : "value", "key": "value"。在前面的例子中,第一个键值对是 ”first_name" : "Sammy"。 JSON 的 在冒号的左边。它们需要用双引号包起来,如 "key",并且可以是任何有效的字符串。在每个对象中,键必须是唯一的。这些键字符串可以包括空格,如 "first name",但这可能使你在编程时更难访问,所以最好使用下划线,如 "first_name"。 JSON 的 在冒号的右边。细致地讲,值需要是以下六种数据类型之一:

  • 字符串
  • 数字
  • 对象
  • 数组
  • 布尔类(真或假)
  • 空值(null)

在更广泛的层面上,值也可以由复杂数据类型,如 JSON 对象或数组来组成,这将在下一节讨论。 每一种作为值传入 JSON 的数据类型都会保持自己的语法,这意味着字符串会有引号,但数字则没有。 .json 文件通常会提供一个扩展为多行的格式,但 JSON 也可以全部写在一行中,如下面的例子:

{ "first_name" : "Sammy", "last_name": "Shark",  "online" : true, }

这在另一种文件类型内或 JSON 字符串中更常见。 这在另一种文件类型内或 JSON 字符串中更常见,或时比较常见。 将 JSON 格式写为多行通常更易读,特别是在处理大数据集时。因为 JSON 会忽略元素之间的空白,你可以把冒号和键值对用空格隔开,以使数据更易读。

{
"first_name" : "Sammy",
"last_name" : "Shark",
"online" : true
}

重要的是要记住,尽管它们看起来很相似,但 JSON 对象与 JavaScript 对象的格式不一样,所以尽管你可以在 JavaScript 对象中使用函数,但你不能在 JSON 中使用函数作为值。JSON 最重要的属性是,可以在编程语言之间以所有涉及到的语言都能使用的格式随时转移。相比之下,JavaScript 对象只能直接通过 JavaScript 编程语言进行操作。 JSON可以通过由嵌套对象和数组组成的层次结构变得越来越复杂。接下来,你将了解更多关于这些复杂的结构的信息。

在 JSON 中处理复杂类型

除了嵌套数组,JSON 还可以用 JSON 格式存储嵌套对象。这些对象和数组将作为分配给键的值传递,也可能由键值对组成。

嵌套对象

在下面的 users.json 文件中,四个用户("sammy""jesse""drew""jamie") 分别有一个嵌套的 JSON 对象作为他们的值被传递,每个值都有自己的嵌套键"username""location",与每个用户相关联。以下代码块中的每个用户条目都是一个嵌套 JSON 对象的例子: users.json

{
"sammy" : {
"username" : "SammyShark",
"location" : "Indian Ocean",
"online" : true,
"followers" : 987
},
"jesse" : {
"username" : "JesseOctopus",
"location" : "Pacific Ocean",
"online" : false,
"followers" : 432
},
"drew" : {
"username" : "DrewSquid",
"location" : "Atlantic Ocean",
"online" : false,
"followers" : 321
},
"jamie" : {
"username" : "JamieMantisShrimp",
"location" : "Pacific Ocean",
"online" : true,
"followers" : 654
}
}

在这个例子中,一个个大括号被用来形成一个嵌套的 JSON 对象,其中有四个用户的相关用户名和位置数据。与其他数值一样,当使用对象时,逗号被用来分隔元素。

嵌套数组

数据也可以嵌套在 JSON 格式中,方法是使用 JavaScript 数组,将其作为一个值传递。JavaScript 在其数组类型的两端使用方括号 [ ]。数组是有序的集合,可以包含不同数据类型的值。 例如,在处理大量可以分组的数据时,你可以使用数组,比如与一个用户相关的各种网站和社交媒体资料。 通过第一个嵌套数组,"Sammy"的用户资料可以表示如下: user_profile.json

{ 
"first_name" : "Sammy",
"last_name" : "Shark",
"location" : "Ocean",
"websites" : [
{
"description" : "work",
"URL" : "https://www.digitalocean.com/"
},
{
"desciption" : "tutorials",
"URL" : "https://www.digitalocean.com/community/tutorials"
}
],
"social_media" : [
{
"description" : "twitter",
"link" : "https://twitter.com/digitalocean"
},
{
"description" : "facebook",
"link" : "https://www.facebook.com/DigitalOceanCloudHosting"
},
{
"description" : "github",
"link" : "https://github.com/digitalocean"
}
]
}

"websites" 键和 "social_media" 键各使用一个数组,来嵌套 Sammy 的两个网站链接和三个社交媒体简介的信息。 你可以确定这些是数组,因为使用了方括号。 在你的 JSON 格式中使用嵌套可以处理更加复杂、有层级结构的数据。

比较 JSON 和 XML

XML,即可扩展标记语言(Xtensible Markup Language),是一种存储可访问数据的方式,人类和机器都可以读取。XML格式可在许多编程语言中使用。 在许多方面,XML 与 JSON 相似,但它需要更多的文本,因此更长,更需要耗费时间来读和写。XML 也必须用 XML 解析器进行解析,但 JSON 可以用标准函数进行解析。另外,与 JSON 不同,XML 不能使用数组。 下面是一个XML格式的例子: users.xml

<users>
<user>
<username>SammyShark</username> <location>Indian Ocean</location>
</user>
<user>
<username>JesseOctopus</username> <location>Pacific Ocean</location>
</user>
<user>
<username>DrewSquir</username> <location>Atlantic Ocean</location>
</user>
<user>
<username>JamieMantisShrimp</username> <location>Pacific Ocean</location>
</user>
</users>

现在,对比以下由 JSON 处理的相同数据: users.json

{"users": [
{"username" : "SammyShark", "location" : "Indian Ocean"},
{"username" : "JesseOctopus", "location" : "Pacific Ocean"},
{"username" : "DrewSquid", "location" : "Atlantic Ocean"},
{"username" : "JamieMantisShrimp", "location" : "Pacific Ocean"}
] }

JSON 更加紧凑,不需要结束标签,而 XML 需要。此外,XML 没有像JSON 这个例子那样使用数组(你可以通过方括号的使用看出)。 如果你熟悉 HTML,你会注意到 XML 在标签的使用方面和 HTML 非常相似。虽然 JSON 比 XML 更精简,不那么冗长,在很多情况下都能快速使用(包括 AJAX 应用中),但在决定使用什么数据结构之前,你首先要了解你所做的项目的类型。

结语

JSON是一种轻量级的格式,使你能够分享、存储和处理数据。作为一种格式,JSON 在 API 中得到了越来越多的支持,包括 Twitter 的 API。JSON 也是一种可以自然地 JavaScript 中使用的格式,并有许多实现,可用于各种流行的编程语言。你可以在 JSON 的介绍网站上阅读完整的语言支持。 因为你可能不会创建你自己的 .json 文件,而是从其他来源采购,所以重要的是少考虑 JSON 的结构,多考虑如何在你的程序中最好地使用 JSON 。例如,你可以通过使用开源工具 Mr.Data Converter 将电子表格程序中的 CSV 或制表符数据转换成 JSON 。你还可以通过创作共用协议许可的 utilities-online.info site 网站将 XML 转换为 JSON,或反过来转换。 最后,当把其他数据类型转换为 JSON,或创建你自己的数据类型时,你可以用 JSONLint 验证你的 JSON,以及用 JSFiddle 在网络开发环境下测试你的 JSON。