Javascript学习之:JSON

JSON(JavaScript Object Notation)
是相同栽轻量级的数据交换格式。它是基于ECMAScript的一个子集,采用全独立于言语的文本格式。这些特色使JSON成为好之数据交换语言。
易于人口阅览和编辑,同时为易机器解析及变化(一般用来升级网络传输速率)。

1、语法

JSON的语法可以象征三栽类型的值:

  • 简言之值:使用以及Javascript相同之语法,可以以JSON中意味字符串、数值、布尔值和null,但是非支持Javascript中的与众不同值undefined。
  • 目标:对象作为同样栽复杂数据结构,表示的凡一致种植无序的键值对。每个键值对饱受之值好是简约值,也得是繁体数据列的价。
  • 数组:数组作为同样种复杂数据结构,表示无异组有序的价值的列表,可以经过数值索引来访问中的值。数组的价值好是另项目——简单值、对象要数组。

脚详细介绍下就三种类型:

1)、简单值:

  数值表示:5

  字符串表示:”Hello World!”

  JSON字符串与Javascript字符串最深的差是,JSON字符串必须动对引号(单引号会引发语法错误)。

2)、对象:

  举一个Javascript对象来对比说明,下面是一个Javascript中之目标字面量:

var man = {
      name: "McBye",
      age: 24
};

  而在JSON中,这个目标字面量就亟须写成:

{
      "name": "McBye",
      "age": 24
}

足看出三个区分:

  • 不曾声明变量,这是以JSON中尚无变量的定义;
  • 从未有过最终的支行,因为马上不是Javascript语句,不需分号;
  • 靶的性质必须加双引号。

3)、数组:

  JSON数组采用的是Javascript中的数组字面量形式。举例如下:

  Javascript数组字面量:var man = [“McBye”, 24, “pku”, true];

  JSON中表示的以及一个数组:[“McBye”, 24, “pku”, true]

  可以看看,JSON数组也未尝变量和分公司。

  将数组和目标成起来,可以组成还复杂的数量集合,例如地方的JSON数组可以扩展为以下:

[
    [
        "name": "McBye",
        "age": 24,
      "college": [
            "pku",
        "eecs"
        ]
    ],
  [
        "name": "King",
        "age": 20,
    ]
]                                    

2、解析和序列化:

  JSON流行的主要原因有是,JSON数据结构可以同Javascript对象开展双向的剖析。

  早期的JSON解析器基本上就是是下Javascript的eval()函数。由于应用eval()对JSON数据结构进行求值存在风险,因为可能会见实施有恶意代码。

1)、JSON对象有少只章程:

  stringify()——用以把Javascript对象序列化为JSON字符串。

var man = {
      name: "McBye",
      age: 24,
    skills: undefine,
    func: function(){//nothing happens...}
};

  对端的Javascript对象序列化:var jsonMan = JSON.stringify(man);

  默认情况下,JSON.stringify()输出的JSON字符串不包外空格或缩进,因此保存在manCopy中的字符串为:

{"name":"McBye","age":24}

  在队化Javascript对象时,所有的函数和原型成员都见面叫故意忽略,不体现在结果被,并且值为undefined的其他性质为会见吃超了。结果中最终都是价值为中的JSON数据类型的实例属性。

  parse()——用以将JSON字符串解析为Javascript对象。

var manCopy = JSON.parse(jsonMan);

  man和manCopy两个目标,除了JSON有意忽略的性能和函数之外,其他性能都是一致的,但不怕没这些让忽略的习性与函数,man和manCopy也是完全独立、没有干之鲜只对象。

2)、序列化选项:

  以实际上使用stringify()函数的时段,除了如序列化的Javascript对象外,还足以另行加点儿只参数,这有限独参数用于指定为不同之不二法门序列化Javascript对象。第一单参数是过滤器,可以是一个频组,也得是一个函数;第二独参数是一个选项,表示是否以JSON字符串中保存缩进。

a、过滤结果:

  如果过滤器参数是多次组,那么stringify()的结果遭遇只包含数组中列有底性。还是以上面的那个例子说明:

var man = {
      name: "McBye",
      age: 24,
    skills: "Javascript",
};
var jsonText = JSON.stringify(man, ["name", "skills"]);

  上面的jsonText的值当是光包含”name”、”skills”两独特性的字符串:

{"name":"McBye","skills":"Javascript"}

  如果第二独参数是函数,传入的函数接受两个参数,属性名和属性值。根据属性名可以理解怎么序列化对象中性能。为了改变序列化对象的结果,函数返回的价就是对应属性的值。要小心的是,如果函数返回了undefined,那么相应的性能会受忽略。

var man = {
      name: "McBye",
      age: 24,
    skills: "Javascript",
};
var jsonText = JSON.stringify(man, function(key, value){
  switch(key):{
    case "name":
      return "King";
    case "age":
      return "secret";
    default:
      return value;
  }
});

  经过这个函数过滤器之后,序列化的JSON字符串的结果是:

{"name":"King","age":"secret","skills":"Javascript"}

b、字符串缩进:

  JSON.stringify()方法的老三独参数用于控制结果遭遇之缩进和空白符。如果这参数是一个数值,那其代表每个级别缩进的空格数。并且,只要传入有效之操纵缩进的参数值结果字符串就会见含有换行符,这是较人性化的一个装置为,不过最好特别缩进格数为10,超过10之语还见面活动转换为10。

c、toJSON()方法:

  给目标定义toJSON方法,可以回去其本身的JSON数据格式。可以啊外对象上加toJSON()方法。例如:

var man = {
      name: "McBye",
      age: 24,
    skills: "Javascript",
    toJSON: function({return this.name;})
};
var jsonText = JSON.stringify(man);

  上述代码执行后jsonText中保留的字符串是”McBye”。

toJSON()可以作为函数过滤器的加,因此掌握序列化的内顺序很重要。序列化一个目标的逐一如下:

  1. 假使有toJSON()方法以能由此它们赢得有效的值,则调用该方法。否则回对象自我;
  2. 万一提供了亚个参数,应用这函数过滤器。传入函数过滤器的价是第1步回去的值;
  3. 针对第2步回去的每个值进行相应的序列化;
  4. 苟提供了第三独参数,执行相应的格式化。

  参考资料:《Professional Javascript for Web Developers》,Nicholas
C.Zakas