Javascript学习之:JSON

JSON(JavaScript Object Notation)
是一种轻量级的数据交流格式。它是基于ECMAScript的二个子集,选用完全部独用立于言语的文本格式。那一个特点使JSON成为能够的数据交流语言。
易于人观望和编排,同时也易于机器解析和变化(壹般用来升级网络传输速率)。

1、语法

JSON的语法能够代表三系列型的值:

  • 简言之值:使用与Javascript相同的语法,能够在JSON中意味字符串、数值、布尔值和null,不过不协助Javascript中的特殊值undefined。
  • 指标:对象作为壹种复杂数据结构,表示的是1种冬日的键值对。各种键值对中的值能够是简简单单值,也足以是犬牙相错数据类型的值。
  • 数组:数组作为壹种复杂数据结构,表示一组有序的值的列表,能够透过数值索引来访问在那之中的值。数组的值能够是别的项目——不难值、对象或数组。

上面详细介绍下那三系列型:

1)、简单值:

  数值表示:五

  字符串代表:”Hello WorldECMAScript,!”

  JSON字符串与Javascript字符串最大的两样是,JSON字符串必须采纳双引号(单引号会引发语法错误)。

2)、对象:

  举3个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,
    ]
]                                    

二、解析与系列化:

  JSON流行的基本点原由之1是,JSON数据结构能够和Javascript对象进行双向的辨析。

  早期的JSON解析器基本上便是选拔Javascript的eval()函数。由于应用eval()对JSON数据结构进行求值存在危机,因为只怕会实施1些恶意代码。

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也是一点1滴独立、未有涉嫌的五个指标。

2)、类别化选项:

  在其实使用stringify()函数的时候,除了要体系化的Javascript对象外,还是可以够再加四个参数,那四个参数用于钦命以差异的不贰秘籍系列化Javascript对象。第四个参数是过滤器,能够是四个数组,也足以是2个函数;第三个参数是三个增选,表示是不是在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"}

  倘使第1个参数是函数,传入的函数接受多个参数,属性名和属性值。根据属性名能够领略怎么种类化对象中质量。为了改变连串化对象的结果,函数再次回到的值就是相应属性的值。要留意的是,尽管函数再次来到了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()方法的第陆个参数用于控制结果中的缩进和空白符。如若这么些参数是叁个数值,那它表示各样级别缩进的空格数。并且,只要传入有效的主宰缩进的参数值结果字符串就会含有换行符,那是比较人性化的3个设置呢,然而最大缩进格数为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. 1经存在toJSON()方法而且能经过它获得有效的值,则调用该办法。不然再次来到对象自笔者;
  2. 借使提供了第四个参数,应用这几个函数过滤器。传入函数过滤器的值是第叁步回去的值;
  3. 对第二步回去的每一个值进行相应的体系化;
  4. 如若提供了首个参数,执行相应的格式化。

  参考资料:《Professional Javascript for Web Developers》,NicolasC.扎卡s