|||
JSON(javaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。由于JSON利用JavaScript的一些模式(如ECMAScript第3版中JavaScript对象字面量)表示结构化数据,因此常被看做是JavaScript的一个严格的子集合。因为可以把JSON直接传给JavaScript的eval()方法,使其转换成JavaScript对 象,所以不需要创建DOM。另外,很多编程语言,例如C++、C#、ColdFusion、Java、Perl、PHP和Python等,都有针对JSON的解析器和序列化器。
1、 JSON建构于两种结构
1、 “名/值”对的集合。
2、 值的有序列表。(在大部分语言中,它被理解为数组)。
2、 JSON具有的形式
1、 对象是一个无序的“名/值”对集合。它起始于“{”结束于“}”,“名/值”对之间用“,”分开,每个名称后面跟一个“:”。
2、 数组是值(value)的有序集合。它起始于“[”结束于“]”,每个值之间用“,”隔开。
3、 值可以是用双引号(double quotes)括起来的字符串(string)、数值(Number)、true or false、null、对象或者数组。
这些结构可以嵌套(nested)。
3、 JSON的数据结构
JSON数据类型包括:字符串、数值(Number)、布尔值(true/false)、null、对象,数组。(JSON不支持JavaScript中的特殊值undefined。)
注意:JSON在字符串的表示方式上与JavaScript最大的不同的是:JSON中的字符串必须为双引号,使用单引号会产生语法错误。
JSON字符串必须使用双引号括起来。它们使用标准的JavaScript转义序列。因此在以下列字符的前面要添加一个反斜线:”(引号)、b(空格)、n(新行)、f(换页)、r(回车)、t(水平定位)、u(为Unicode字符增加4个数位)、(反斜线符号)、/(正斜杠符号)。
4、 JSON对象表示方法
JSON在表示对象时,一定要注意一下规则:
规则1:JSON中无变量的概念;
规则2:末尾无分号(;);
规则3:对象的属性必须加双引号(“”),且同一个对象中不能出现同名属性;
规则4:属性的值可以是简单的数据类型,如字符串、数值、布尔值、null;也可以是复杂型数据类型,如对象、数组。
规则5:对象中可以嵌套对象。例如创建JOSN文本形式的member对象:
{
“id”: 1
“member”: [
{
“name”:”Tom”,
“age”:22
},
{
“name”:”WangMing”,
“age”:25
}
]
}
5、 JSON数组的表示方法
JSON数组也没有变量和分号。对象和数组嵌套起来,可以形成较为复杂的数据结构。例如:
[
{
“title”: “professional JavaScript”,
“authors”: {
“ChengDong”
},
“edition”:3
},
{
“title”: “professional JavaScript”,
“authors”: {
“name”: chengdong,
“age”: 25
},
“edition”:3
}
]
6、 JSON解析与序列化
JSON除拥有与JavaScript类似的语法外,还能够把JSON数据结构解析为JavaScript对象。在早期版本的浏览器中,使用eval()方法对JSON数据结构求值存在一定的风险,可能会执行一些恶意代码,因此在ECMA Script5中定义了全局变量JSON对象,支持这个对象的浏览器与IE8+、fireFox 3.5+、Safari 4+、Chrome和Opera 10.5+。
下面例子中讲述了JSON对象的stringify()和parse()的使用方法,其中前者表示将JavaScript对象序列化为JSON数据格式,而后者表示将JSON数据格式解析为原生的JavaScript值。
7、 Demo
window.onload = function(){
// JavaScript创建的person对象
var person = {
name: ["ChengDong", "ZhangSan"],
age: 25,
book: {
title: "Professional JavaScript",
author: "Nicholas C. zakas",
year: 2011,
edition:undefined//值为undefined的属性将会被跳过执行
}
}
//把JavaScript对象序列化为一个JSON字符串
var jsonText = JSON.stringify(person);
alert(jsonText);//outputs: {"name":["ChengDong","ZhangSan"],"age":25,"book":{"title":"Professional JavaScript","author":"Nicholas C. zakas","year":2011}}
//stringify(obj, array):返回数组中只包含的属性的“名/值”对.
var jsonTest2 = JSON.stringify(person, ["name", "age", "book"]);
alert(jsonTest2);//outputs: {"name":["ChengDong","ZhangSan"],"age":25,"book":{}}
//数组包含的属性必须同属于一个对象
var jsonTest3 = JSON.stringify(person, ["name","year"]);
alert(jsonTest3);//{"name":["ChengDong","ZhangSan"]}
//stringify(obj, function):通过函数过滤要转换为JSON格式的字符串.
var jsonTest4 = JSON.stringify(person, function(key, value){
switch (key) {
case "name":
return value.join(",");
//返回undefined时,序列化为JSON字符串时将被省略执行
case "age":
return undefined;
default:
return value;
}
});
alert(jsonTest4);//outputs: {"name":"ChengDong,ZhangSan","age":25,"book":{"title":"Professional JavaScript","author":"Nicholas C. zakas"}}
//stringify(person,null,4),数值:每个级别缩进4个空格;字符串:缩进字符(可以是空格等)
var jsonTest5 = JSON.stringify(person,null,"--");
alert(jsonTest5);
var book = {
title: "Professional JavaScript",
"authors": ["Nicholas C.Zakas"],
edition:3,
year:2011,
person: {
name: "ChengDong",
age: 25
},
//在对象上调用toJSON方法,返回其自身的JSON数据格式(其实是一个自定义过滤条件)
toJSON: function(){
//return this.title;//outputs: "Professional JavaScript"
return undefined;//outputs: undefined
//return this.name;//outputs: undefined
}
}
var toJSONTest = JSON.stringify(book,["year","edition"]);
alert(toJSONTest);
var book2 = {
"title": "Professional JavaScript",
"authors": ["Nicholas C.Zakas"],
"edition": 3,
"year": 2011,
releaseDate: new Date(2011,11,1)
}
var jsonText01 = JSON.stringify(book2);
alert(jsonText01);//outputs: {"title":"Professional JavaScript","authors":["Nicholas C.Zakas"],"edition":3,"year":2011,"releaseDate":"2011-11-30T16:00:00.000Z"}
//通过函数进行过滤
var bookCopy = JSON.parse(jsonText01, function(key, value){
var val = (key === "releaseDate") ? new Date(value) : value ;
return val
});
alert(bookCopy.releaseDate.getFullYear());
}
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-6-2 20:43
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社