JavaScript之JSON

来源:互联网 发布:淘宝开通企业店铺 编辑:程序博客网 时间:2024/06/06 02:10

JSON是JavaScript一个严格的子集,它利用了JavaScript中的模式表示结构化数据。JSON可以直接传给eval(),而不必创建DOM对象(不必声明变量)。

注:JSON是一种数据格式,不是编程语言。JSON不是JavaScript独有的。

什么是JSON:

  • JSON是JavaScript对象表示法
  • JSON是轻量级的文本数据交换格式
  • JSON具有独立性,不是JavaScript独有的。
  • JSON具有自我供述性、更容易理解。


语法

JSON的语法可以表示以下三种类型的值:

  • 简单值,与JavaScript语法相似,可以表示数字值、字符串值、布尔值和null,但JSON不能表示undefined。
  • 对象,与JavaScript中的对象相似。
  • 数组,与JavaScript中的数组相似。

注:JSON不支持变量,函数或对象实例,它只是一种表示结构化数据的格式。因此,JSON没有声明变量一说,三种类型的值直接书写就是。


简单值

JSON支持数字值、字符串、布尔值和null。


在JavaScript中表示这三种类型的值可以是这样的:

var a = 1234, //表示数字值b = "hello JSON", //表示字符串,用双引号c = "hello JavaScript", //表示字符串,用单引号d = true; //表示布尔值

而在JSON是这样表示这三种类型的值的:

1234"hello JSON""hello JavaScript"true

从上述两个例子,我们可以看出JavaScript与JSON的两个不同点:

  • JavaScript需要声明变量用来保存这三种类型的值,也就是说需要声明变量并初始化变量,且每个语句后面必须有分号表示。而JSON因为不支持变量,所以无需声明变量,直接书写值,并传递给eval(),并且JSON不加分号
  • JavaScript字符串与JSON字符串的最大区别在于,JavaScript的字符串可以用双引号表示,也可以用单引号表示。但JSON的字符串必须用双引号表示,否则会报错。
注:在JSON表示布尔值时,不能添加双引用,否则就变成了字符串。


对象

JSON的对象与JavaScript字面量对象有一点不同,在JavaScript中表示字面量对象:

var obj = {    name : "tom",    age : 21,    sayName : function () {        alert(this.name);    }};

在JavaScript中,属性名也可以添加双引用表示:

var obj = {    “name” : "tom",    “age” : 21,    “sayName” : function () {        alert(this.name);    }};

而在JSON中,没有声明变量这一操作(不支持变量)属性名必须用双引用,且末尾没有分号注:花括号是有的

{    "name" : "tom",     "age" : 21,     "sayName" : function () {        alert(this.name);    }}



再次声明:JSON对象或字符串中,属性名或字符串必须添加双引用。


数组

JSON数组就是采用JavaScript的字面量形式,在JavaScript中的字面量数组:

var arr = [21, "tom", true];

而在JSON中的字面量数组:

[21, "tom", true]

可以看出,JSON中的字面量数组,没有声明变量这一操作,且末尾没有分号。



解析与序列化

JSON可以把JSON数据结构解析为JavaScript对象。


JSON对象

JSON对象有两个方法,分别是stringify()和parse()。在最简单的情况下,它们分别可以将JavaScript对象序列化为JSON字符串和将JSON字符串解析成JavaScript值。

例如:

var book = {    title : "a good book",    authors : "zhang",    edition : 3,    year : 2017};//将JavaScript对象序列化为JSON字符串,并将其保存在变量jsonText中var jsonText = JSON.stringify(book);


JSON.stringify()将JavaScript对象序列化为JSON字符串,默认情况下(在没有传入参数的情况下),输出的JSON字符串不包含任何空格和缩进,此时输出的JSON字符串为:

{"title":"a good book","authors":"zhang","edition":3,"year":2017}

除了原字符串间的空格,其它的空格和缩进均被删除了。


注:在序列化JavaScript对象时,所有的函数和原型成员会被有意忽略。值为undefined的任何属性也会被跳过。


将JSON字符串传递给JSON.parse()会得到相应的JavaScript值。

var javaScriptText = JSON.parse(jsonText);



注:book与javaScriptText虽然有相同的属性,但它们是相互独立、没有任何关系的对象。如果传递给JSON.parse()的不是有效的JSON字符,则会报错。



序列化选项

JSON.parse()方法可以接收三个参数:第一个参数就是要序列化的JavaScript对象,第二个参数是个过滤器,可以是一个数组,也可以是一个函数,第三个参数是个选项,表示是否在JSON字符串中保留空格和缩进。


过滤结果

如果第二个参数是一个数组,那么JSON.parse()的结果将只包含数组中列出的属性
var book = {    title : "a good book",    authors : "zhang",    edition : 3,    year : 2017};//数组中列出的属性是title、year,那么JSON字符串中只保留这两个属性及属性值。var jsonText = JSON.stringify(book, ["title", "year"]);

JSON.parse()输出的结果为:
{"title":"a good book","year":2017}

结果中只保留了"title"和"year"这两个属性。


如果第二个参数是一个函数,那么此函数接收两个参数:属性名和属性值,根据属性名可以知道如何处理要序列化的对象中的属性。



JSON字符串缩进

JSON.stringify*()方法中的第三个参数用于控制结果中的空格和缩进。

如果是参数数值,注:最大缩进数为10,如果设置的缩进数大于10,则转换成10。

var book = {    title : "a good book",    authors : "zhang",    edition : 3,    year : 2017};//结果中以4为缩进数var jsonText = JSON.stringify(book, [book, null, 4]);

输出结果:

{    title : "a good book",    authors : "zhang",    edition : 3,    year : 2017}

字符间的缩进数为4,当设置有效的缩进参数时,那么结果中也会包含换行符,如果只有缩进而无换行,那么缩进也没有多大意义。


当第三个参数(缩进参数)不是数字,而是其它字符时,那么就以此字符中缩进,如:

var book = {    title : "a good book",    authors : "zhang",    edition : 3,    year : 2017};//结果中以"--"为缩进数var jsonText = JSON.stringify(book, [book, null, "--"]);

输出结果:

{--title : "a good book",--authors : "zhang",--edition : 3,--year : 2017}

"--"代替了缩进空格。至于换行,则是因为有效的缩进"--"的结果。

注:同理,当以字符为缩进参数时,字符的长度也不能超过10个字符,如果超过10个字符,那么只显示前10个字符。


toJSON()方法

toJSON()方法返回自身的JSON数据格式。如果对象中有这个方法,则优先执行该方法,且能通过它取得有效值的话,返回该方法的值。执行完这个方法后,才开始序列化对象。

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

var book = {    title : "a good book",    authors : "zhang",    edition : 3,    year : 2017    toJSON : function () {        return this.title;    }};var jsonText = JSON.stringify(book, [book]);

此对象定义了一个toJSON()方法,返回"title"的值。那么这个对象将被序列化为一个字符串而非对象了。可以让toJSON()方法返回任何值,它才能正常工作。


理解序列化的内部顺序:

  • 如果对象中有toJSON()方法,且通过它能取得有效的值,则调用该方法,否则返回对象本身。
  • 如果提供了第二个参数,应用这个函数过滤器,传入过滤器的值是上一步返回的值。
  • 将上一步返回的每个值序列化。
  • 如果有第三参数,则进行相应的格式化。


解析选项

JSON.parse()方法接收两个参数:第一个参数是JSON字符串,第二个参数是一个还原函数,与JSON.stringify()方法的过滤器的签名是相同的--接收两个参数,即属性名和属性值。




总结

JSON的特点:

  • JSON是纯文本
  • JSON具有层次结构(值中有值)
  • JSON可通过JavaScript的eval()解析
  • JSON可被Ajax传输
  • JSON具有自我描述性


JSON与XML的不同之处:

  • 没有结束标签
  • 更短
  • 读写速度更快
  • 可被JavaScript的eval()解析
  • 使用数组
  • 不使用保留字


为什么JSON比XML的读写速度更快:

使用XML:

  • 读取XML文档
  • 使用XML DOM来循环遍历文档
  • 读取值并保存在变量中

使用JSON:
  • 读取JSON字符串
  • 使用eval()处理JSON字符


1 0
原创粉丝点击