JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。数组
JSON建构于两种结构:服务器
1. “名称/值”对的集合(A collection of name/value pairs)。不一样的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。数据结构
2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。异步
按照最简单的形式,能够用下面这样的 JSON 表示 "名称 / 值对" :{ "firstName": "Brett" }函数
这个示例很是基本,并且实际上比等效的纯文本 "名称 / 值对" 占用更多的空间:firstName=Brett工具
可是,当将多个"名称 / 值对"串在一块儿时,JSON 就会体现出它的价值了。首先,能够建立包含多个"名称 / 值对"的 记录,好比:学习
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }ui
从语法方面来看,这与"名称 / 值对"相比并无很大的优点,可是在这种状况下 JSON 更容易使用,并且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;花括号使这些值有了某种联系。spa
当须要表示一组值时,JSON 不但可以提升可读性,并且能够减小复杂性。例如,假设您但愿表示一我的名列表。在 XML 中,须要许多开始标记和结束标记;若是使用典型的 名称 / 值 对(就像在本系列前面文章中看到的那种名称 / 值对),那么必须创建一种专有的数据格式,或者将键名称修改成 person1-firstName这样的形式。对象
若是使用 JSON,就只需将多个带花括号的记录分组在一块儿:
{ "people": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
]}
这不难理解。在这个示例中,只有一个名为 people的变量,值是包含三个条目的数组,每一个条目是一我的的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。固然,可使用相同的语法表示多个值(每一个值包含多个记录):
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] }
这里最值得注意的是,可以表示多个值,每一个值进而包含多个值。可是还应该注意,在不一样的主条目(programmers、authors 和 musicians)之间,记录中实际的名称 / 值对能够不同。JSON 是彻底动态的,容许在 JSON 结构的中间改变表示数据的方式。
在处理 JSON 格式的数据时,没有须要遵照的预约义的约束。因此,在一样的数据结构中,能够改变表示数据的方式,甚至能够以不一样方式表示同一事物。
掌握了 JSON 格式以后,在 JavaScript 中使用它就很简单了。JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不须要任何特殊的 API 或工具包。
例如,能够建立一个新的 JavaScript 变量,而后将 JSON 格式的数据字符串直接赋值给它:
var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] }
这很是简单;如今 people包含前面看到的 JSON 格式的数据。可是,这还不够,由于访问数据的方式彷佛还不明显。
尽管看起来不明显,可是上面的长字符串实际上只是一个数组;将这个数组放进 JavaScript 变量以后,就能够很轻松地访问它。实际上,只需用点号表示法来表示数组元素。因此,要想访问 programmers 列表的第一个条目的姓氏,只需在 JavaScript 中使用下面这样的代码:
people.programmers[0].lastName;
注意,数组索引是从零开始的。因此,这行代码首先访问 people变量中的数据;而后移动到称为 programmers的条目,再移动到第一个记录([0]);最后,访问 lastName键的值。结果是字符串值 “McLaughlin”。
下面是使用同一变量的几个示例。
people.authors[1].genre // Value is "fantasy"
people.musicians[3].lastName // Undefined. This refers to the fourth entry, and there isn't one
people.programmers[2].firstName // Value is "Elliotte"
利用这样的语法,能够处理任何 JSON 格式的数据,而不须要使用任何额外的 JavaScript 工具包或 API。
正如能够用点号和括号访问数据,也能够按照一样的方式轻松地修改数据:
people.musicians[1].lastName = "Rachmaninov";
在将字符串转换为 JavaScript 对象以后,就能够像这样修改变量中的数据。
固然,若是不能轻松地将对象转换回本文提到的文本格式,那么全部数据修改都没有太大的价值。在 JavaScript 中这种转换也很简单:
String newJSONtext = people.toJSONString();
这样就好了!如今就得到了一个能够在任何地方使用的文本字符串,例如,能够将它用做 Ajax 应用程序中的请求字符串。
更重要的是,能够将任何JavaScript 对象转换为 JSON 文本。并不是只能处理原来用 JSON 字符串赋值的变量。为了对名为 myObject的对象进行转换,只需执行相同形式的命令:
String myObjectInJSON = myObject.toJSONString();
这就是 JSON 与本系列讨论的其余数据格式之间最大的差别。若是使用 JSON,只需调用一个简单的函数,就能够得到通过格式化的数据,能够直接使用了。对于其余数据格式,须要在原始数据和格式化数据之间进行转换。即便使用 Document Object Model 这样的 API(提供了将本身的数据结构转换为文本的函数),也须要学习这个 API 并使用 API 的对象,而不是使用原生的 JavaScript 对象和语法。
最终结论是,若是要处理大量 JavaScript 对象,那么 JSON 几乎确定是一个好选择,这样就能够轻松地将数据转换为能够在请求中发送给服务器端程序的格式。