ECMAscript5提供的全局对象JSON


/* 
内容来自:http://msdn.microsoft.com/zh-cn/library/cc836459%28v=vs.94%29.aspx

JSON是ECMAscript5提供的全局对象。IE8及以上的版本支持此对象,但需要注意的是,在这些高版本的浏览器上有的页面可能使用兼容视图加载,这时就可能不支持此对象了,这时可以使用json2.js这个文件代替。json2的地址是:https://github.com/douglascrockford/JSON-js/blob/master/json2.js

JSON对象有两个方法:stringify() 和 parse(),分别用于将json对象序列化为字符串以及将字符串反序列化为json对象。
*/

// stringify方法
/* ---------------------------------------------------------------------------------------------- */
/* 
JSON.stringify(jsonObj [, replacer] [, space])
jsonObj:需要转换的json对象或数组。
replacer:相当于一个序列化前的过滤器。
	如果replacer是函数,则此函数有两个参数,分别是一个键值对中的键和值。即形如:function (key, value){...  return newValue}。
	将返回的值作为key对应的新的value进行序列化。如果返回值是undefined,则将此键值对过滤掉。【例:userStr1】
	需要特别说明的是,根节点也被看做一个键值对,他的键是'',即一个空串,值就是json对象本身。【例:userStr2】
	
	如果replacer是一个数组,则这个数组用来规定可以序列化的所有键值对的键值以及他们被序列化时的顺序。【例:userStr3】
	如果jsonObj本身就是数组,则忽略这第二个参数。【例:userStr4】
space:缩进。【例:userStr5】
	即在【每个】键值对(包括子级的键值对【例:userStr5中的girlfriend属性】)前面加上指定的空格或者字符。
	空格和字符的最大长度为10,如果超过10个,则只截取前10个使用。
	如果space是数字,则插入相应数目的空格。如果是字符串,则直接插入。
	注意:如果space不是空的,则在序列化时会自动为每个键值对换行
	
执行顺序:如果value有toJSON方法,则先执行toJSON方法。然后用toJSON方法的返回值使用replacer方法。然后再使用space,形成最终的输出结果。
 */

// json对象
var user = {};
user.name='Tim';
user.country = 'USA';
user.gender = 'male';

var userStr0 = JSON.stringify(user);
// alert(userStr0);// {"name":"Tim","country":"USA","gender":"male"}

var userStr1 = JSON.stringify(user, function(key, value){
	if(key === 'gender'){
		// return 'female';//将gender属性修改为female。
		return; // 即返回undefined。过滤掉gender属性。
	}
	return value;
});
// alert(userStr1);

user.girlfriend = {name:'Tina', heifht:168, '':123};//添加子级的键值对。
var userStr2 = JSON.stringify(user, function(key, value){
	// if(key === ''){//过滤掉根节点,即整个json对象
	if(key === 'name'){// 过滤掉name属性
		return;
	}
	return value;
});
// alert(userStr2);

var userStr3 = JSON.stringify(user, ['name', 'girlfriend', 'contry', 'job']);// 第二个参数是数组时,他用来指定需要序列化的键值对和他们的顺序。
// alert(userStr3);

var menu = ['bread', 'sugar', 'coffee'];
var userStr4 = JSON.stringify(menu, ['bread']);// 如果前两个参数都是数组,则第二个参数会被忽略。
// alert(userStr4);//  ==> ["bread","sugar","coffee"]

var userStr5 = JSON.stringify(user, function(k, v){return v} , 2);
// var userStr5 = JSON.stringify(user, function(k, v){return v} , '---');
// var userStr5 = JSON.stringify(user, function(k, v){return v} , '+++++++++++++++++++++++++++');// 长度超过10
// alert(userStr5);

var mistress = {name:'Monica', heifht:169, 'major':'physics'};// 第三者出场了
user.girlfriend.toJSON = function (){// 这里定义了toJSON方法,所以在输出的时候,user的girlfriend就从Tina变成了Monica。
	return mistress;
}
var userStr6 = JSON.stringify(user, function(k, v){return v;}, '--');
alert(userStr6);

/* ---------------------------------------------------------------------------------------------- */
/* ---------------------------------我是分割线--------------------------------------------------- */
/* ---------------------------------------------------------------------------------------------- */

// parse 方法
/* ---------------------------------------------------------------------------------------------- */
/*
JSON.parse(text [, reviver])
text:json字符串
reviver: 一个用于转换结果的函数
	结果的每一个元素在返回前要执行此方法,如果返回的是有效的值,则用转换后的值代替原始值。如果返回的是null或者undefined,则将此元素过滤掉。相当于一个过滤器。
	如果一个元素是嵌套对象(即他对称是一个对象或者数组),则先将他的子级对象使用reviver函数,然会再对元素本身使用reviver函数。
	(这里说的元素,可以简单的理解为一个键值对。但如果是数组呢???????)
返回值是一个对象或者数组

*/
var userStr7 = JSON.stringify(user);
alert(userStr7);
var parsedObj = JSON.parse(userStr7);
alert(parsedObj.name);
alert(parsedObj.gender);
alert(parsedObj.girlfriend);// ==>[object Object]

var parsedObj2 = JSON.parse(userStr7, function(key, value){
	if(key === 'girlfriend'){
		return JSON.stringify(value);
	}
	return value;
});

alert(parsedObj2.name);
alert(parsedObj2.gender);
alert(parsedObj2.girlfriend);// ==>{"name":"Tina","heifht":168,"":123}

/**
由此看来,stringify和parse的第二个参数的作用是一样的。
*/

你可能感兴趣的:(JavaScript)