JS 之JSON学习

JSON是一个数据交换格式,由键值对组成,通常被用来当做配置文件,这两天做一套前端笔试题(谈谈你对json的理解),于是决定来认真看一下。其实在很久之前就接触过JSON.stringify()这个方法,把json对象序列化成json字符串,最大的好处就是你可以将一个对象序列化后再alert,你会看的很清楚这个对象的内部结构,但是如果你调试时直接alert这个对象,得到的就是下图

            var val={
                0:"D",
                1:"J",
                2:"L",
                3:"others"
            }
            
            alert(val)                    

但是如果你序列化以后,就清楚了

alert(JSON.stringify(val))

因为在序列化以后,实际上输出的是一个字符串。当然这里序列化会有很多的限制,大家直接看下面的链接就行

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

其实最终的就是这个函数的第二个参数,是一个可选参数,可以是一个函数,也可以是一个数组

JSON.stringify(value[, replacer [, space]])

当这个参数为一个函数时,就是把要序列化JSON对象的键和值传进去,做一些处理之后,返回一个新的值,所以这个函数的参数是json对象序列化后的‘键和值’。例如:

       var val={
                0:"D",
                1:"J",
                2:"L",
                3:"others"
            }
            
            var json_str=JSON.stringify(val,function(key,val){
                if(key==="3"){
                    return undefined
                }
                return val;
            });
            console.log(json_str+"   " + typeof json_str);

得到的结果如上图,可见当key==="3"时,返回的是undefined,就会忽略这个键值对,而不会出现在序列化的结果中。

当然你也可以通过传入一个数组实现相同的功能,如果序列化对象中的键没有出现在数组值中,那么这个键值对就会被忽略。例:

       var val={
                0:"D",
                1:"J",
                2:"L",
                3:"others"
            }
            
            var json_str=JSON.stringify(val,function(key,val){
                if(key==="3"){
                    return undefined
                }
                return val;
            });
            console.log(json_str+"   " + typeof json_str);
            
            var json_str2=JSON.stringify(val,["0","1","2"]);
            console.log(json_str2+"   " + typeof json_str2);

可见两个达到了相同的效果。

toJSON 方法

如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用 toJSON 方法后的返回值会被序列化,例如:

var obj = {
  foo: 'foo',
  toJSON: function () {
    return 'bar';
  }
};
JSON.stringify(obj);      // '"bar"'
JSON.stringify({x: obj}); // '{"x":"bar"}'

JSON.parse 方法

很显然就是反序列化,把一个json字符串,转换成json对象

使用 JSON.stringify 结合 localStorage 的例子

一些时候,你想存储用户创建的一个对象,并且,即使在浏览器被关闭后仍能恢复该对象。下面的例子是 JSON.stringify 适用于这种情形的一个样板:

// 创建一个示例数据
var session = {
    'screens' : [],
    'state' : true
};
session.screens.push({"name":"screenA", "width":450, "height":250});
session.screens.push({"name":"screenB", "width":650, "height":350});
session.screens.push({"name":"screenC", "width":750, "height":120});
session.screens.push({"name":"screenD", "width":250, "height":60});
session.screens.push({"name":"screenE", "width":390, "height":120});
session.screens.push({"name":"screenF", "width":1240, "height":650});

// 使用 JSON.stringify 转换为 JSON 字符串
// 然后使用 localStorage 保存在 session 名称里
localStorage.setItem('session', JSON.stringify(session));

// 然后是如何转换通过 JSON.stringify 生成的字符串,该字符串以 JSON 格式保存在 localStorage 里
var restoredSession = JSON.parse(localStorage.getItem('session'));

// 现在 restoredSession 包含了保存在 localStorage 里的对象
console.log(restoredSession);

参考链接:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

https://developer.mozilla.org/zh-CN/docs/Using_native_JSON#The_replacer_parameter

https://developer.mozilla.org/zh-CN/docs/JSON

 

原文地址:https://www.cnblogs.com/djlxs/p/5635641.html