JSON的序列化与还原
JSON
--- ⼀种数据格式
--- ⽀持的数据类型:字符串、数值、Boolean、null,对象,数组。
JSON对象序列化 --- JSON.stringify()
功能 >>> 把数据对象转化为字符串
使⽤ >>> JSON.stringify(value[, replacer [, space]])
value: 被序列化的对象(PS:对象可以⾃定义 toJSON() ⽅法,以更改序列化结果)
replacer: 对象序列化调⽤的函数、数字或字符串的数组,指定对象中需要被序列化的属性。
返回 undefined ,对象的该属性将被删除;返回⼀个 Object 对象,该 Object 对象将⾃动被递归序列化。
space: 数字N或字符串,为了可读效果,对序列化的字符串插⼊N个空⽩或⼀个特定字符(PS:如果⾃定义了字符,就没办法重新⽤parse()解析回对象了)
// 例⼦1:
var obj = { "a": 100,
"b": 'jack',
"c": "www\"kk\"www",
"say": function(){alert("hello")},
"d": [1,2,3],
"e": {"e1":"hwow"},
"f": true,
"g": new Date()
};
var str = JSON.stringify(obj);
/
/ -- output --
{"a":100,"b":"jack","c":"www\"kk\"www","d":[1,2,3],"e":{"e1":"hwow"},"f":true,"g":"2012-08-21T02:33:22.969"}
// 例⼦2:
function censor(key, value) {
switch(key){
case "foundation": return {"Company":value,"Modifier": "Shawn"};
case "model": return undefined;
case "week" : return 30;
// 不要像下⾯这句那样做!!返回对象不能⾃定义toJSON⽅法;IE下报堆栈溢出错误,Firefox直接就崩溃了。
// case "transport": return {"transport":value,"toJSON": function(){return "UNKNOW";}};
default: return value;
// ⼀定要提供default项返回传⼊的值,以保证其他值都能正常出现在结果中。
}
}
var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
var jsonString = JSON.stringify(foo, censor, "~");
console.log(jsonString);
// --- output ----
{ ~"foundation": { ~~"Company": "Mozilla", ~~"Modifier": "Shawn" ~},~"week": 30, ~"transport": "car", ~"month": 7 }
还原为JSON对象 --- JSON.parse()
功能 >>> 将字符串化的数据还原为JSON对象
使⽤ >>> JSON.parse(value[, replacer])
value:被还原的对象字符串
replacer: 对象还原调⽤的函数。如果返回 undefined ,对象的该属性将被删除。
var book = {
"name" : "程序设计",
"pubDate": new Date(2010,1,1),
"releaseDate" : new Date(2009,10,10),
"price" : 199
}
var jsonText = JSON.stringify(book);
console.log(jsonText);
/
/ {"name":"程序设计","pubDate":"2010-01-31T16:00:00.000Z","releaseDate":"2009-11-09T16:00:00.000Z","price":199}
var bookCopy = JSON.parse(jsonText,function(key, value){
if(key === "pubDate"){
return new Date(value);
}else if(key === "price"){
浏览器json格式化return undefined;
}
return value;
});
console.log(typeof bookCopy.price);              // undefined 已经被删除了
console.log(typeof bookCopy.pubDate);        // object Date类型
console.log(leaseDate);    // string 默认仍然是字符串
PS:
1.使⽤stringify ⽅法将对象串⾏化,则应该使⽤parse ⽅法还原。
这在本地存储的读取时候,容易犯错,出现bug:
var aStr = "hello";
var result = JSON.stringify(aStr);
console.log(result);                    // "hello"  注意:这⾥前后多了2个双引号
console.log(result === aStr);      // false
var aStr2 = JSON.parse(result);    //使⽤parse()⽅法还原
console.log(aStr === aStr2);      // true
2.⽀持原⽣JSON对象的浏览器:IE8+, Firefox
3.5+, Safari 4+, Chrome, and Opera 10.5+.实现跨浏览器需要⽤到第三⽅库。
3.Date 类型在序列化时将⾃动转为字符串。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。