JavaScript之JSON

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值