JavaScript之JSON

时间:2022-03-24 08:46:30

一、简介:Json是JavaScript中读取结构化数据更好的方式。因为Json数据可以直接传给eval(),而且不必创建DOM对象。Json是一种数据格式,不是一种编程语言,虽然具有相同的语法形式,带Json并不从属于JavaScript.而且,并不是只有JavaScript才使用Json,毕竟Json只是一种数据格式。很多编程语言都有针对Json的解析器和序列化器。

二、语法

Json的语法可以表示一下三种类型的值

1、简单值:使用与JavaScript相同的语法,可以在Json中表示字符串、数值、布尔值和null。注意:Json不支持JavaSciprt中的特殊值:undefined。

2、对象:对象作为一种复杂的数据类型,表示的是一组无序的键值对儿。而每个键值对中的值可以是简单值,也可以是复杂数据类型的值。

3、数组:数组也是一种复杂的数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是简单值、对象、数组。

2.1 简单值

简单值在Json中的表示可以是字符串、数值、布尔值和null!

注意:上面这些数据都和JavaScript中一样,只有字符串,在Js中字符串可以用单引号表示,但是在Json中字符串使用单引号会报错!

2.2 对象

Js中的对象,代码如下:

var person={
name:"张三",
age:23
}; var person={
"name":"张三",
"age":23
};

在JS中上面两种方法都可以表示对象,但是在Json中没有变量的概念。其次,没有末尾的分号(因为这不是JavaScipt语句,所以也不需要分号),

所以在Json的对象中,对象的属性必须是字符串(也就是说要加双引号),属性的值可以是简单值,数组,对象,所以在Json中的对象表现形式如下:

{
"name":"张三",
"age":23
}

注意:对象的属性名必须加双引号!

三、Json的解析与序列化

JSON之所以流行,拥有与JavaScript类似的语法并不是全部的原因,更重要的原因是,可以把Json数据结构解析为有用的JavaScipt对象。与XML数据解析成DOM文档而且从中提取数据麻烦相比,JSON可以解析为JavaScript对象的优势十分明显!代码如下:

[
{"title":"book_one",
"year":"2016"
},
{"title":"book_two",
"year":"2015"
},
{"title":"book_three",
"year":"2015"
},
]

下面需要取得第三本书的名字,通过Json转换为JavaScript对象的方式获取

books[2].title

通过XML解析成DOM元素,在获取:

document.getElementsByTagName("book")[2].getAttribute("title");

比较两种方法,就知道Json为什么会得到JavaSciprt开发人员的欢迎了!

早期的JSON解析器基本上是使用JavaScipt的eval()函数。由于Json是JavaScript语法的子集,因此eval()函数可以解析、解释并返回JavaScript对象和数组。在旧版本的浏览器中,使用Eval()对JSON数据结构求值存在风险,可能会执行一些恶意代码。对于不能支持原生JSON解析的浏览器,使用shim是最佳选择。地址:   shim:https://github.com/douglascrockford/JSON-js;

3.1 JSON对象

ECMAScript 对解析JSON的行为进行了了规范,定了全局对象JSON;

支持两个方法:stringify()和parse()。在最简单的情况下,这两个方法风别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。

1、stringify()

    var book={
title:"book_title",
authors:["张三","李四"],
edition:3,
year:2016
}
var jsonText=JSON.stringify(book);
alert(jsonText);

输出:{"title":"book_title","authors":["张三","李四"],"edition":3,"year":2016}

aaarticlea/png;base64,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" alt="" />

这里需要注意,在默认情况下(也就是不提供第三个参数的情况下)JSON.stringify()输出的JSON字符串不包含任何的空格字符或缩进,但是如果你提供第三个参数,就是JSON字符串添加字符缩进的话,那么所返回的JSON字符串就会产生缩进,代码如下:

    var book={title:"book_title",authors:["张三","李四"],edition:3,year:2016}
var jsonText=JSON.stringify(book,null,4);
alert(jsonText);

输出图如下:aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAANkAAACuCAIAAAA0+z9YAAAH30lEQVR4nO2dwXHrLBRGVVGySiPJOlV4XIE7yKSGbDOTJrJhJm28Mv7F/UOuASmSrIhPcDxn4fBsjMR5IOAKDeHfF4ACQ/USABi4CCrgIqiAi6ACLoIKuAgq4CKogIugAi6CCrgIKuAiqICLoAIuggq4CCrgIqig6OIwDKfLuXoxYGfkXHx5e318fqpeDNgfORdPlzONYp/gIqgg5+Lj8xMu9omWi6fLmYvFbtFyMdAudoyci1wvdgsuggpyLjK/2C1yLgbWXXpF0UXoE1wEFXARVMBFUAEXQYVmXXz//BiG4f3zIz3gYeNDvnu4f3l73Tmf3Y5uTw5cdOPu4f50Od893Cfp62prLLeJzxzIxTlHV5HDu2jr19Nm+MTp2kpyW/2LK5iTzw5HV5EWXHx5e93QRZ/b6l9cwT4u/np0FTm8i1cH8/26e7i3XixJDNe1Ff+puMwz1g8mmAoxK+/K4F7Fcvr0qJT9br4Quu3RCdKUiyGr0SQxuNrynhXbm/kuxjxNyph/lGBOupXBUsZ+dMOjE6RTF31LdmPjkdR0VCrpCqfT7c3j89Ovg4+dj25P+nVxq8um+S6+f36Mpdsba2InWuL9j25POnXR3sTEYpTa/D46fv10OY/1xVGOsXQrpP3oWJe64dEJ0pqLZoO/uveJwdWWfSAfcEQWuTh/jDKWnihV7Kw3P7rq9XV1WqqXAKogGLOMi7ok449tx8Kny1ltcI2LoAIuggq4CCrgIqiAi6ACLn6F69VbqFYL1UtwI5vEh27r4pwi2fS42gxfXQ7v4ur40GSdY0MXZwbkqk3vVacFF9eFAvypizMDcqufPSkO72JCvg7rF14nQlBtVTfpNycWjuN34xeLy7tji9q4mNOai9GkGKZadDFk7aJ90aszjAe9FjMsgovzac3FkDVUM130UdBjgYYx6DW/kWBpF4+LOU25aKpZYxa129DFGPRavAFqkZG4mNOUi16gGNbqe0kf6zrtYvgt6NXem7V5eoQ+ej5NuRi+2ye7/kuiTYuJceySuxhmBL2G75nCsclCXJxPay4eBVzMwcU6sO6Sg4ugAi6CCrgIKuAiqICLoELXLvp77G3W2u874xdahvFX9aNohu5OZTHQ9fH5ybs4vdnX/GxhEd25WAx09S76/XFuzBYW0aOLcXHZR/TkffTqbGEd3bno8ft4FC8KWRfZk65dtK45/mntYv7Q4HxrzfhiTXlDenfRD4fNxffPD7raKnTtYsTki9eLBNFUARe/gttaOIkJh11roXoJFPDtol0F3jJBg8rr6PqUxTmd2DV7h06X8+Pzk7+mLL7ysbbglq+HoGsX/wjBLV8PAS6CCrgIKuAiqICLoAIuggq4+EO+Em0QS7sP3Z1KH/TqN8grvmJct303xlL4/UzybGEd3bk4FvT6+PxkUbR50zjHRWJpb6dHF5OgV1tZ8QFjw/UDl2e6SCztjXTnoidaaH/660Uz0pbyij1y8gZup2sXjeKKc/J48vDvy8c14uJfgItX2Ggm3wU0fI9OLCXqi4sbgos/jD3TfmxME2gXN6VrF2fGg00Ih4sb0rWLCe+fH8W4Q+a694FT+cOEi2NfoV3cEFz8ClmAN1QBF0EFXAQVcBFUwEVQARdBBVwEFY7toi2cMMnXBsd2MVw/NRIODS6CCrgIKuAiqICLoAIuggq4CCq04yK7wR6dw1dedJHdYI/OsV306y7sBnt0ju0itAQuggq4CCrgIqiAi6BCdy4m85H+OaljibAPh3dx6Yawf+TizGKw28TUyaleghtZuiFscc3w7uH+xrnJOcXwG4cyLZ/TgouLlqT/zsX5xWANvcjhXSwc0vfLb0jid2NK1q99erKoXdzDyXKe2PPk145+bAe9zmnNRS9BbO38roq2R3y4jqWIn/SJXrWXt1efbj3smHPT6cUtHiE05qIZ41+2SO07xGJcT+5i3o16s73uKwY68f8DeFpzMa/jDV007W53MckE/j8n1Uuw8fFcd8d54t3D/bo+Oqr5q4tjs0WxPDwJplx31UuwLf5RVtE/33cnD72yD9hYZP7YZYWLwe3yGHMj/tfDiagJ8b8eXKwJ8b8eXAQVcBFUwEVQARdBBVwEFXARVDi8i0tjabfNuTi1HtwkuZ/xtin3ZBLHz8NXP5l1OfzxL42l3Tbn+K/JiqItHvroHlt7TAIlCWT0tODiH9Xo0pxtPTBZ1kvky/8kQiJyeBc9/nHjSTRDEvpa7FtNlKG0Gf2c+2BigI9f1kvCZr2L758f9mTqibDcrmjKRe+ftWphJLo26pJ0o2MXbfNDtU+X80wX/eUj9x+GxlwMzrzYSuXRtfbJPGpm9V0v/l6q+e1icgHAjQetuXi6nA0TonjBZ42QVXwxinERyU19yS9OXC9aH+3zwcX6hdgQq2A/Jsija70u1jra+wkXx/pQf4XqEy2fiRsVkq/TR4f2XAzZ3SRjwxRLsaFDTFzkYn4BYB/wvxg/HH8xKUlxerJP2nSx887uoLTmIlH7x6WparMOl87uoDTlIhwaXAQVcBFUwEVQARdBBS0X/SoI9IZcxcf4GugNORctsqF6MWB/cBFUUHSR7Y76RM7FQHBDr8i5SLvYLYou0ij2CS6CCnIuMr/YLVousu7SM1Q8qICLoAIuggq4CCrgIqiAi6ACLoIKuAgq4CKogIugAi6CCv8BHTK89w2Cfq0AAAAASUVORK5CYII=" alt="" />结合上面没有提供第三个参数的情况下,发现给stringify()提供第三个参数的情况下,在每个级别上增加了4个空格,增加了JSON字符串的可读性!

还有一种情况,如下:

    var book={title:"book_title",authors:["张三","李四"],edition:3,year:2016}
var jsonText=JSON.stringify(book,null,"--");
alert(jsonText);

输出图如下:aaarticlea/png;base64,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" alt="" />发现给stringify()提供第三个参数的情况下且为字符串的情况,它会解析字符串的长度,并在每个级别上增加了(字符串长度)个字符串!

JSON.stringify()除了接收第一个参数(要序列化的JavaScript对象外),还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化JavaScript对象。第一个参数是过滤器,可以是一个数组,也可以是一个函数,第二个参数是一个数值或者字符串,用于表示是否在JSON字符串中保留缩进(这个参数在上面已经介绍了),下面是关于stringify()方法的过滤器参数,代码如下:

    var book={title:"book_title",authors:["张三","李四"],edition:3,year:2016}
var jsonText=JSON.stringify(book,function(key,value){
switch (key){
case"authors":return value.join("$$")
case"edition":return 3+" version"
case"year":return "2016-10-19"
default:return value;
}
});
alert(jsonText);

输出图:aaarticlea/png;base64,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" alt="" />

当stringify使用第二个参数时,有一个特殊情况,代码如下:

    var book={title:"book_title",authors:["张三","李四"],edition:3,year:2016}
var jsonText=JSON.stringify(book,function(key,value){
switch (key){
case"authors":return value.join("$$")
case"edition":return undefined
case"year":return "2016-10-19"
default:return value;
}
});
alert(jsonText);

输出图:aaarticlea/png;base64,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" alt="" />

当给edition属性赋了undefined值的时候,JSON.stringify()返回JSON字符串对象时,去除了属性值为undefined的属性!

有时候,JSON.stringify()还不能满足对某些对象进行自定义序列化的需求。在这些情况下,可以给对象定义toJSON()方法,返回其自身的JSON格式数据。原生的Date对象有一个toJSON()方法,能够将JavaScript的Date对象自动转换为日期字符串,代码如下:

    var book={title:"book_title",authors:["张三","李四"],edition:3,year:2016,toJSON:function(){
return this.title;
}}
var jsonText=JSON.stringify(book);
alert(jsonText);

输出图:aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOkAAABVCAIAAAAjXVS6AAACNklEQVR4nO3XQW7aQBiGYZ8IVlwE1pwCcQJuEOUM2SJlFXVZVWJjCXXfA/QYXUyxhgFTklahn/xYz4L8sZA1eWOPu/7nERJ1D78C+Bjtkkq7pNIuqbRLKu2SSruk0i6ptEsq7ZJKu6TSLqm0Syrtkkq7pNIuqbRLKu2SSruk0i6ptEsq7ZJKu6TSLqm0Syrtkkq7pNIuqbRLKu2SSruk0i6ptEsq7ZJKu6TSbmu2mD+9PH/y9+wPr13X7Q+vzbzr/IFGWZrjbDHf7LazxXz4MaXd5sqnRrvH5Xr1qHavnlMPb7fbXPnUaPe4XK+eXp5D262vfGq02yrpdKejbqurjrNFvDYfEiz7geV61S796Zgt5uWcZtiftzv8arPbPnyV/gfabc0W86GYEvHvlaqiuWde2i2Ty41sfU5/6rsZ9lW79Zf8qydDOu22mjKGBJtH8+15+bBcr/74snVPu/VzwK13oN3W/e3uD69j8/Kh3MLHbrr9e9qd7Kb2Bu22yv2yfN7stmN7gyGmsXlJsEQ59oh/155hGF5unadJu63hWX/nO9nYvEnw6uah/G/U72r1sK/aLSdcvj5OmXZJpd1PXOvzw+3zb9fz4VcAH6NdUmmXVNollXZJpV1SaZdU2iWVdkmlXVJpl1TaJZV2SaVdUmmXVNollXZJpV1SaZdU2iWVdkmlXVJpl1TaJZV2SaVdUmmXVNollXZJpV1SaZdU2iWVdkmlXVJpl1Td2/cvkKj7+uMbJPoF4lB8coOWnzoAAAAASUVORK5CYII=" alt="" />根据这个输出,和上面所有JSON.stringify()方法的输出我们总结出一个规律,那就是:

JSON.stringify()的序列化顺序如下:

(1)如果被序列化的对象存在toJSON()方法而且能通过它取得有效的值,则调用该方法,如果该方法取不到有效的值,则返回对象本身。

(2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。

(3)对第(2)步返回的值进行序列化。

(4)如果提供了第三个参数,则按照对三个参数,对对象执行相应的格式化

2、parse()

    var book={
title:"book_title",
authors:["张三","李四"],
edition:3,
year:2016
}
var jsonText=JSON.stringify(book);
alert(JSON.parse(jsonText));

输出:[object Object] ,firebug截图,监视查看对象如图:

aaarticlea/png;base64,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" alt="" />