zoukankan      html  css  js  c++  java
  • JSON的序列化与还原

    JSON
    --- 一种数据格式
    --- 支持的数据类型:字符串、数值、Boolean、null,对象,数组。


    JSON对象序列化 --- JSON.stringify()

    功能 >>> 把数据对象转化为字符串
    使用 >>> JSON.stringify(value[, replacer [, space]])
             value: 被序列化的对象(PS:对象可以自定义 toJSON() 方法,以更改序列化结果)
             replacer: 对象序列化调用的函数、数字或字符串的数组,指定对象中需要被序列化的属性。
                          返回 undefined ,对象的该属性将被删除;返回一个 Object 对象,该 Object 对象将自动被递归序列化。
             space: 数字N或字符串,为了可读效果,对序列化的字符串插入N个空白或一个特定字符(PS:如果自定义了字符,就没办法重新用parse()解析回对象了)

    // 例子1:
        var obj = { "a": 100,
                    "b": 'jack',
                    "c": "www"kk"www",
                    "say": function(){alert("hello")},
                    "d": [1,2,3],
                    "e": {"e1":"hwow"},
                    "f": true,
                    "g": new Date()
                };
        var str = JSON.stringify(obj);
        
        // -- output --
        {"a":100,"b":"jack","c":"www"kk"www","d":[1,2,3],"e":{"e1":"hwow"},"f":true,"g":"2012-08-21T02:33:22.969"}
    
    // 例子2:
        function censor(key, value) {
          switch(key){
            case "foundation": return {"Company":value,"Modifier": "Shawn"};
            case "model": return undefined;
            case "week" : return 30;
            // 不要像下面这句那样做!!返回对象不能自定义toJSON方法;IE下报堆栈溢出错误,Firefox直接就崩溃了。
            // case "transport": return {"transport":value,"toJSON": function(){return "UNKNOW";}};
            default: return value;
            // 一定要提供default项返回传入的值,以保证其他值都能正常出现在结果中。
          }
        }
         
        var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
        var jsonString = JSON.stringify(foo, censor, "~");
        console.log(jsonString);
        
        // --- output ----
        { ~"foundation": { ~~"Company": "Mozilla", ~~"Modifier": "Shawn" ~},~"week": 30, ~"transport": "car", ~"month": 7 }




    还原为JSON对象 --- JSON.parse()

    功能 >>> 将字符串化的数据还原为JSON对象
    使用 >>> JSON.parse(value[, replacer])
             value:被还原的对象字符串
             replacer: 对象还原调用的函数。如果返回 undefined ,对象的该属性将被删除。
                     

        var book = {
            "name" : "程序设计",
            "pubDate": new Date(2010,1,1),
            "releaseDate" : new Date(2009,10,10),
            "price" : 199
        }
        var jsonText = JSON.stringify(book);
        console.log(jsonText);
        // {"name":"程序设计","pubDate":"2010-01-31T16:00:00.000Z","releaseDate":"2009-11-09T16:00:00.000Z","price":199}
    
        var bookCopy = JSON.parse(jsonText,function(key, value){
            if(key === "pubDate"){
                return new Date(value);
            }else if(key === "price"){
                return undefined;
            }
            return value;
        });
        console.log(typeof bookCopy.price);               // undefined 已经被删除了
        console.log(typeof bookCopy.pubDate);         // object Date类型
        console.log(typeof bookCopy.releaseDate);    // string 默认仍然是字符串
     

    PS:
    1.使用stringify 方法将对象串行化,则应该使用parse 方法还原。
    这在本地存储的读取时候,容易犯错,出现bug:

         var aStr = "hello";
         var result = JSON.stringify(aStr);
         console.log(result);                     // "hello"  注意:这里前后多了2个双引号
         console.log(result === aStr);      // false
    
         var aStr2 = JSON.parse(result);    //使用parse()方法还原
         console.log(aStr === aStr2);       // true

    2.支持原生JSON对象的浏览器:IE8+, Firefox 3.5+, Safari 4+, Chrome, and Opera 10.5+.
    实现跨浏览器需要用到第三方库。

    3.Date 类型在序列化时将自动转为字符串。

  • 相关阅读:
    洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告
    牛客练习赛 小D的剑阵 解题报告
    牛客练习赛 小A与最大子段和 解题报告
    牛客练习赛 小D的Lemon 解题报告
    牛客练习赛 小A与任务 解题报告
    洛谷 P1452 Beauty Contest 解题报告
    洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告
    【模板】矩阵求逆
    洛谷 P4097 [HEOI2013]Segment 解题报告
    连接数据库的增删改查
  • 原文地址:https://www.cnblogs.com/travelling-wxy/p/5008065.html
Copyright © 2011-2022 走看看