JSON 简介
作者 Lisa Tagliaferri
导言
JSON 是 JavaScript 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。