JSON.parse与JSON.stringify

平时我们用JSON.parse或者JSON.stringify的时候,经常只会传入一个参数,即:要序列化的对象或者反序列化的对象字符串.实际上这两个方法都可以传入第2个function参数去处理对应的value值.

function函数支持两个参数key,value分别对应处理后的key,value,可以通过函数去动态改变对应的value值.

    //JSON.stringify 示范代码.
    let data = {
        test: 'test',
        msg: '成功',
        data: {
            value: 1,
            text: 'hello',
            time: new Date()
        },
        time: new Date(),
        fun: function (a, b) {
            console.log(a + b);
        }
    }

    let jsonStr = JSON.stringify(data, (key, value) => {
        switch (key) {
            case 'test':
                return undefined;   //返回undefined,最终不会序列化
            case 'time':
                return value.replace('T', ' ');
            default:
                if (typeof value === 'function') { 
                    //简单处理函数的序列化方式,实际上真正的处理要复杂的多
                    return value.toString();
                }
                return value;
        }
    }, 4); //stringify还支持第3个参数格式化字符串(4代表4个空格,也可以输入字符串去代替.)

使用JSON.stringify的时候也要注意对象是否有toJSON这个方法.如果存在的话最终序列化会调用toJSON这个方法(一般情况不太可能重写js的序列化方法)

同样的,JSON.parse也支持第2个参数去处理最终的value值.

    let jsonObj = JSON.parse(jsonStr, (key, value) => {
        if (key === 'time') {
            return new Date(value);
        } else if (typeof value !== 'object' && /^function/.test(value)) {
            //简单的对函数进行处理.
            return eval('(' + value + ')');
        }
        return value;
    });

这让我们有些情况下处理序列化及反序列化得到很大的灵活性,不过似乎没有找到修改key的办法(除了改写toJSON),如果有的话请千万告诉我.^_^

标签: none

添加新评论