JavaScript中的json解析和序列化

ECMAScript 5 对解析 JSON 的行为进行规范,定义了全局对象 JSON
核心方法: stringify() 和 parse()

JSON对象

把对象转成json格式的字符串

var book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
var jsonText = JSON.stringify(book);

结果:{“title”:”Professional JavaScript”,
“authors”:[“Nicholas C. Zakas”,”Geguo”],
“edition”:3,”year”:2011}

注意
* 函数及原型成员都会被有意忽略,不体现在结果中。
* 此外,值为undefined 的任何属性也都会被跳过
* 结果中最终都是值为有效 JSON 数据类型的实例属性

将 JSON格式字符串转成对象

直接传递给 JSON.parse() 就可以得到相应的 JavaScript 值。

var bookCopy = JSON.parse(jsonText);

注意
虽然 book 与 bookCopy 具有相同的属性,但它们是两个独立的、没有任何关系的对象。

如果传给 JSON.parse() 的字符串不是有效的 JSON,该方法会抛出错误。

序列化选项

stringify()方法还可以接收两个其他参数

如果参数是数组,将过滤结果

var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
// 只序列化 title,edition字段
var jsonText = JSON.stringify(book, ["title", "edition"]);

序列化后的结果为:{“title”:”Professional JavaScript”,”edition”:3}

如果第二个参数是函数,则可以改变序列化的值

var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};

//每个在对象的每个键值上调用该函数
var jsonText = JSON.stringify(book, function(key, value){
    switch(key){
    case "authors":
    return value.join(",")
    case "year":
    return 5000;
    case "edition":
    return undefined;
    default:
    return value;
}
});

注意:
根据属性(键)名可以知道应该如何处理要序列化的对象中的属性。
属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串
为了改变序列化对象的结果,函数返回的值就是相应键的值
如果函数返回值是undefined,那么该属性会被忽略掉

转换结果:(editor属性被忽略)
{“title”:”Professional JavaScript”,
“authors”:”Nicholas C. Zakas”,”year”:5000}

第三个参数用来控制序列化缩进

JSON.stringify() 方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。例如,要在每个级别缩进 4 个空格,可以这样写代码

var jsonText = JSON.stringify(book, null, 4);
保存在 jsonText 中的字符串如下所示:
{
    "title": "Professional JavaScript",
    "authors": [
    "Nicholas C. Zakas"
    ],
    "edition": 3,
    "year": 2011
}

如果缩进参数是一个字符串而非数值,则这个字符串将在 JSON 字符串中被用作缩进字符(不再使用空格) 。在使用字符串的情况下,可以将缩进字符设置为制表符,或者两个短划线之类的任意字符

var jsonText = JSON.stringify(book, null, " - -");
这样, jsonText 中的字符串将变成如下所示:
{
--"title": "Professional JavaScript",
--"authors": [
----"Nicholas C. Zakas"
--],
--"edition": 3,
--"year": 2011
}

缩进字符的长度不能超过10个

toJson

解析选项

parse()还可以接收第二个参数,对值进行限制
第二个参数是一个函数,每个键值都会调用

var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2016,
releaseDate: new Date(2016, 11, 7)
};
var jsonText = JSON.stringify(book);

var bookCopy = JSON.parse(jsonText, function(key, value){
//将Date类型字符串转成Date对象
if (key == "releaseDate"){
return new Date(value);
} else {
return value;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值