zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    《剑指offer》39题—数组中出现次数超过一半的数字
    常见排序算法实现
    剑指offer题目分类
    腾讯2019实习面试题
    Word2vec资料
    Hello World投票以太坊Dapp教程-Part1
    以太坊开发框架Truffle学习笔记
    linux查看端口进程占用情况
    重置fedora root密码
    docker挂载本地目录的方法总结
  • 原文地址:https://www.cnblogs.com/djlxs/p/5635641.html
Copyright © 2011-2022 走看看