
JSON概念JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式主要用于跟服务器进行交换数据。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式但是也使用了类似于C语言家族的习惯包括C、C、C#、Java、JavaScript、Perl、Python等。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写同时也易于机器解析和生成(一般用于提升网络传输速率)。JSON 语法JSON 语法规则JSON 语法是 JavaScript 对象表示语法的子集。数据在键值对中数据由逗号分隔花括号保存对象方括号保存数组JSON 名称/值对JSON 数据的书写格式是名称/值对。名称/值对组合中的名称写在前面在双引号中值对写在后面(同样在双引号中)中间用冒号隔开例firstName:John 等价于这条 JavaScript 语句firstNameJohnJSON 值JSON 值可以是数字整数或浮点数字符串在双引号中逻辑值true 或 false数组在方括号中对象在花括号中null基础结构JSON结构有两种结构json简单说就是javascript中的对象和数组所以这两种结构就是对象和数组两种结构通过这两种结构可以表示各种复杂的结构。对象对象在js中表示为“{}”括起来的内容数据结构为 {keyvalue,keyvalue,…}的键值对的结构在面向对象的语言中key为对象的属性value为对应的属性值所以很容易理解取值方法为 对象.key 获取属性值这个属性值的类型可以是 数字、字符串、数组、对象几种。数组数组在js中是中括号“[]”括起来的内容数据结构为 [“java”,”javascript”,”vb”,…]取值方式和所有语言中一样使用索引获取字段值的类型可以是 数字、字符串、数组、对象几种。基础示例简单地说 JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串然后就可以在函数之间轻松地传递这个字符串或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪但是JavaScript很容易解释它而且 JSON 可以表示比”名称 / 值对”更复杂的结构。例如可以表示数组和复杂的对象而不仅仅是键和值的简单列表。名称 / 值对按照最简单的形式可以用下面这样的 JSON 表示”名称 / 值对”{“firstName”:”Brett”}这个示例非常基本而且实际上比等效的纯文本”名称 / 值对”占用更多的空间firstNameBrett但是当将多个”名称 / 值对”串在一起时JSON 就会体现出它的价值了。首先可以创建包含多个”名称 / 值对”的 记录比如{“firstName”:”Brett”,”lastName”:”McLaughlin”,”email”:”aaaa”}从语法方面来看这与”名称 / 值对”相比并没有很大的优势但是在这种情况下 JSON 更容易使用而且可读性更好。例如它明确地表示以上三个值都是同一记录的一部分花括号使这些值有了某种联系。表示数组当需要表示一组值时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: sciencefiction }, { firstName: Tad, lastName: Williams, genre: fantasy }, { firstName: Frank, lastName: Peretti, genre: christianfiction }], 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: sciencefiction }, { firstName: Tad, lastName: Williams, genre: fantasy }, { firstName: Frank, lastName: Peretti, genre: christianfiction }], musicians: [{ firstName: Eric, lastName: Clapton, instrument: guitar }, { firstName: Sergei, lastName: Rachmaninoff, instrument: piano }] };访问数据尽管看起来不明显但是上面的长字符串实际上只是一个数组将这个数组放进 JavaScript变量之后就可以很轻松地访问它。实际上只需用点号表示法来表示数组元素。所以要想访问 programmers 列表的第一个条目的姓氏只需在 JavaScript 中使用下面这样的代码people.programmers[0].lastName;注意数组索引是从零开始的。所以这行代码首先访问 people变量中的数据然后移动到称为 programmers的条目再移动到第一个记录[0]最后访问 lastName键的值。结果是字符串值 “McLaughlin”。下面是使用同一变量的几个示例。people.authors[1].genre //fantasypeople.musicians[3].lastName // Undefined.people.programmers[2].firstName //Elliotte利用这样的语法可以处理任何 JSON 格式的数据而不需要使用任何额外的 JavaScript 工具包或 API。修改数据正如可以用点号和方括号访问数据也可以按照同样的方式轻松地修改数据people.musicians[1].lastName”Rachmaninov”;在将字符串转换为 JavaScript 对象之后就可以像这样修改变量中的数据。换回字符串如果要处理大量 JavaScript 对象那么 JSON 是一个好选择这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式。JSON嵌套格式许多JavaScript树形控件使用JSON嵌套格式描述树形结构如下所示{ id: 100000, text: 廊坊银行总行, children: [ { id: 110000, text: 廊坊分行, children: [ { id: 113000, text: 廊坊银行开发区支行, leaf: true }, { id: 112000, text: 廊坊银行解放道支行, children: [ { id: 112200, text: 廊坊银行三大街支行, leaf: true }, { id: 112100, text: 廊坊银行广阳道支行, leaf: true } ] }, { id: 111000, text: 廊坊银行金光道支行, leaf: true } ] } ] }具体形式对象是一个无序的“‘名称/值’对”集合。1一个对象以“{”左括号开始“}”右括号结束。2每个“名称”后跟一个“:”冒号3“‘名称/值’ 对”之间使用“,”逗号分隔。例子表示人的一个对象{ 姓名:大憨, 年龄:24 }数组是值value的有序集合。1一个数组以“[”左中括号开始“]”右中括号结束。2值之间使用“,”逗号分隔。例子一组学生{ 学生: [ {姓名:小明,年龄:23}, {姓名:大憨,年龄:24} ] }说明此Json对象包括了一个学生数组而学生数组中的值又是两个Json对象。3. 值value可以是双引号括起来的字符串string、数值(number)、true、false、 null、对象object或者数组array。这些结构可以嵌套。4. 字符串string是由双引号包围的任意数量Unicode字符的集合使用反斜线转义。一个字符character即一个单独的字符串character string。 字符串string与C或者Java的字符串非常相似。5. 数值number也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。