IT人才网JSON学习笔记

来源:互联网 发布:淘宝虚拟店铺怎么开 编辑:程序博客网 时间:2024/06/08 05:50
JSON可以表示三种类型的值:                                                (以下笔记主要参考《JavaScript高级程序设计》,部分来源自己动手。)
简单值:基本语法与JS 一致,但不支持特殊值undefined
对象:对象作为一种复杂数据类型,表示一组有序的键值对。
数组:数组也作为一种复杂数据类型,表示一组有序的值的列表。

简单值:
可表示数字,字符串及null值,注意:字符串必须用双引号,单引号会导致语法出错。

对象:
JSON中的对象与javascript中的字面量稍有不同,
下面是一个javascript的对象字面量:
  1. var person = {
  2.         name : "Xiao Ming",
  3.         age : 18
  4. };
复制代码


JSON中要求给属性加双引号,且JSON中没有变量概念,因此JSON表示上述对象的方式如下:

  1.    "name" : "Xiao Ming",
  2.    "age" : 18
复制代码


且末尾不需要分号。
JSON对象可以嵌套,如下:
  1. {
  2.         "name" : "Xiao Ming",
  3.         "age" : 18 ,
  4.         "school" : {
  5.                 "name" : "GDUEF College",
  6.                 "location" : "GZ"
  7.         }
  8. }
复制代码


尽管存在两个同名的属性,但其各属于不同的对象,因此没有任务冲突。

数组:
同样,首先来对比javascript中的数组字面量:
var values = [25,"hi",true];
在JSON中,可以采用同样的语法表示一个数组类型:
[25,"hi",true]
注意没有分号和变量。
把数组和对象组合起来,可以构成更加复杂的数据集合:
  1. [
  2.         {
  3.                 "title" : "Professional JavaScript",
  4.                 "authors" : [
  5.                         "Nicholas C. Zakas"                
  6.                 ],
  7.                 "edition" : 3,
  8.                 "year" : 2011
  9.         },
  10.         {
  11.                 "title" : "Professional JavaScript",
  12.                 "authors" : [
  13.                         "Nicholas C. Zakas"                
  14.                 ],
  15.                 "edition" : 2,
  16.                 "year" : 2009
  17.         },
  18.         {
  19.                 "title" : "Professional Ajax",
  20.                 "authors" : [
  21.                         "Nicholas C. Zakas",
  22.                         "Jeremy McPeak",
  23.                         "Joe Fawcett"
  24.                 ],
  25.                 "edition" : 2,
  26.                 "year" : 2008
  27.         },
  28.         {
  29.                 "title" : "Professional Ajax",
  30.                 "authors" : [
  31.                         "Nicholas C. Zakas",
  32.                         "Jeremy McPeak",
  33.                         "Joe Fawcett"
  34.                 ],
  35.                 "edition" : 1,
  36.                 "year" : 2007
  37.         },
  38.         {
  39.                 "title" : "Professional JavaScript",
  40.                 "authors" : [
  41.                         "Nicholas C. Zakas"                
  42.                 ],
  43.                 "edition" : 1,
  44.                 "year" : 2006
  45.         }
  46. ]
复制代码



这个数组包含一些图书对象,然而每个对象中的authors属性的值又是一个数组。

JSON对象有两个方法stringify()和parse():
stringify():用于把JavaScript对象序列化为JSON字符串。
parse():把JSON字符串解析为原生JavaScript值。
  1. var book = {
  2.                     "title" : "Professional JavaScript",
  3.                     "authors" : [
  4.                         "Nicholas C. Zakas"                
  5.                      ],
  6.                     "edition" : 1,
  7.                     "year" : 2006
  8.                 };
  9. var jsonBook = JSON.stringify(book);

  10. var bookCopy = JSON.parse(jsonBook);
复制代码



book与bookCopy具有相同的属性,但它们是独立的,没有任何关系的对象。

stringify()除了接收要序列化的JavaScript对象外,还可接收两个参数,第一个是一个过滤器,可以是一个数组(假如是数组,JSON.stringify()只会列出数组中列出的属性,),也可以是一个函数(函数接收两个参数,属性名(键)和属性值,根据属性名可以知道如何处理序列化的对象中的属性,属性名只能是字符串,而值是想要返回的值,不一定是键值对结构时的值,键名可以是空字符串,假如键名是空字符串,结果将会返回该空字符串对应的值,不再是JSON格式数据,这是我自己测试结果,有待大家一起验证。假如函数返回了undefined,结果将会忽略掉对应的键名)下面看例子:
  1. var book = {
  2.                 "title" : "Professional JavaScript",
  3.                 "authors" : [
  4.                 "Nicholas C. Zakas",
  5.                 "Tom",
  6.                 "Jack"
  7.                  ],
  8.                 "edition" : 1,
  9.                 "year" : 2006
  10.                 };
  11. var jsonText = JSON.stringify(book,["title","edition"]);
  12.         console.log("jsonText stringify by Array : "+jsonText);
  13.         var jsonText2 = JSON.stringify(book,function(key,value){
  14.                         switch(key){
  15.                                 case "authors":
  16.                                         return value.join(" , "); 
  17.                                 case "year" :
  18.                                         return 5000; 
  19.                                 case "edition":
  20.                                         return undefined; 
  21.                                 default :
  22.                                         return value;
  23.                         }
  24.         });
  25.         console.log("jsonText2 stringify by function : "+jsonText2);
复制代码
打印结果为
  1. jsonText stringify by Array : {"title":"Professional JavaScript","edition":1} 
  2. jsonText2 stringify by function : {"title":"Professional JavaScript","authors":"Nicholas C. Zakas , Tom , Jack","year":5000}
复制代码

假如在switch语句中添加一个
  1. case "":
  2. return "lalala" ;
复制代码
第二个打印结果就变成:
  1. jsonText2 stringify by function : "lalala"
复制代码
只有文本,不再是JSON格式了。


最后一个是一个选项,表示JSON字符串中是否保留缩进。如果这个参数是一个数值,则表示的是每个级别缩进的空格数,如果是一个字符而非数值,则这个字符串将在JSON字符串中被用作缩进字符,(而非空格。如制表符,短划线等)

toJSON()方法(对这个方法不是很理解)

可以为任何对象添加toJSON()方法,如:

文章来源:It人才网

  1. var book = {
  2.                 "title" : "Professional JavaScript",
  3.                 "authors" : [
  4.                 "Nicholas C. Zakas",

0 0
原创粉丝点击