JSON及使用


要点:

  • JSON,一种数据格式,不是一种编程语言
  • 并不只是JavaScript才使用JSON,很多编程语言都有针对JSON的解析器和序列化器
  • JSON,可以直接传给eval() ,不必创建DOM对象
  • JSON,可以表示一下三种类型的值:简单值(字符串、数值、布尔值、null,注意没有undefined)、对象、数组
  • JSON字符串必须使用双引号
  • JSON不支持变量、函数、对象实例
  • JSON对象有两个方法:stringify()和parse(),分别用于把JavaScript对象序列化为JSON字符串,把JSON字符串解析为原生的Javascript值。
  • 直接使用JSON.stringify() 输出的JSON字符串不包含任何空格字符或者缩进
  • 在序列化JavaScript对象时,所有函数、原型成员、值为undefined的任何属性都会被忽略
  • JSON.stringify()还可以另外接收两个参数,一个是过滤器,可以是数组也可以是函数;另一个可表示JSON中是否保留缩进
  • toJSON方法,作为函数过滤器的补充
  • 传给JSON.parse()的字符串如果不是有效的JSON,该方法会抛出错误
  • JSON.parse() 方法也可以接收另一个参数,该参数是一个函数(还原函数)


stringify序列化(JavaScript对象):

例1. 数组过滤器+结果缩进4个空格

        var book = {
            "title": "JS",
            "authors": [
                "小红",
                "小明"
            ],
            "edition": 4,
            "year": 2018
        }
        var jsonText = JSON.stringify(book, ["title", "edition"]);
        console.log(jsonText);

结果:

{
    "title": "JS",
    "edition": 4
}

例2. 函数过滤器,默认没有缩进

        var book = {
            "title": "JS",
            "authors": [
                "小红",
                "小明"
            ],
            "edition": 4,
            "year": 2018
        }
        var jsonText = JSON.stringify(book, function(key, value){
            switch (key){
                case "author":
                    return value.join(",");
                    break;
                case "year":
                    return 5000;
                    break;
                case "edition":
                    return undefined;
                    break;
                default:
                    return value;
            }
        });
        console.log(jsonText);

结果:{"title":"JS","authors":["小红","小明"],"year":5000}

例3. toJSON

        var book = {
            "title": "JS",
            "authors": [
                "小红",
                "小明"
            ],
            "edition": 4,
            "year": 2018,
            toJSON: function () {
                return this.title;
            }
        }
        var jsonText = JSON.stringify(book);
        console.log(jsonText);
结果:"JS"

toJSON()可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要。假设把一个对象传入 JSON.stringify(),序列化该对象的顺序如下。

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

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

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

(4) 如果提供了第三个参数,执行相应的格式化。


parse解析:

例4. 还原函数

        var book = {
            "title": "JS",
            "authors": [
                "小红",
                "小明"
            ],
            "edition": 4,
            "year": 2018,
            releaseDate: new Date(1999,11,1)
        };
        var jsonText = JSON.stringify(book);
        console.log(jsonText);
        var bookCopy = JSON.parse(jsonText, function (key,value) {
            if(key=="releaseDate"){
                return new Date(value);
            } else{
                return value;
            }
        })
        console.log(bookCopy);
结果:

{"title":"JS","authors":["小红","小明"],"edition":4,"year":2018,"releaseDate":"1999-11-30T16:00:00.000Z"}

 {title: "JS", authors: Array(2), edition: 4, year: 2018, releaseDate: Wed Dec 01 1999 00:00:00 GMT+0800 (中国标准时间)}

 如果没有还原函数:

        var book = {
            "title": "JS",
            "authors": [
                "小红",
                "小明"
            ],
            "edition": 4,
            "year": 2018,
            releaseDate: new Date(1999,11,1)
        };
        var jsonText = JSON.stringify(book);
        console.log(jsonText);
        var bookCopy = JSON.parse(jsonText);
        console.log(bookCopy);

结果:

{"title":"JS","authors":["小红","小明"],"edition":4,"year":2018,"releaseDate":"1999-11-30T16:00:00.000Z"}
{title: "JS", authors: Array(2), edition: 4, year: 2018, releaseDate: "1999-11-30T16:00:00.000Z"}

 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值