JSON.parse和JSON.stringify

JSON.parse()

JSON.parse()方法將json字符串轉化為Javascript值或對象。

語法

JSON.parse(text[,reviver])

參數

text:要被解析成Javascript值的字符串
reviver:若是一個函數則規定了原始值(text)如何被解析改造,在被返回前。

示例

JSON.parse('{}');              // {}
JSON.parse('true');            // true
JSON.parse('"foo"');           // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null');            // null

使用reviver函數(解析值本身以及它所包含的所有屬性,會按照一定的順序:從最最里層的屬性開始一級級往外,最終到達頂層,也就是解析值本身分別的去調用reviver函數)

JSON.parse('{"p":5,"":100}',function(k,v){
          if(k === "") return v;
          return v*2;
})
返回:{p:10,"":100}


//從這個例子可以看出遍歷是從內往外的。
JSON.parse('{"1":1,"2":2,"3":{"4":4,"5":{"6":6}}}',function(k,v){
          console.log(k); //輸出當前的屬性名,從而得知遍歷順序是從內向外的,最后一個屬性名會是個空字符串。
          return v;  //返回原始屬性值,相當于沒有傳遞reviver參數。
})
返回:1 2 4 6 5 3 ""

JSON.stringify()

JSON.stringify() 方法將一個JavaScript值轉換為一個JSON字符串,如果指定了一個replacer函數,則可以替換值,或者如果指定了一個replacer數組,可選的僅包括指定的屬性.

語法

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

參數

value:將要序列化成 一個JSON字符串的值
replacer:如果該參數是一個函數,則在序列化過程中,被序列化的值的每個屬性都會經過該函數的轉換和處理;如果該參數是一個數組,則只有包含在這個數組中的屬性名才會被序列化到最終的 JSON 字符串中;如果該參數為null或者未提供,則對象所有的屬性都會被序列化;
space:指定縮進用的空白字符串,用于美化輸出(pretty-print);如果參數是個數字,它代表有多少的空格;上限為10。該值若小于1,則意味著沒有空格;如果該參數為字符串(字符串的前十個字母),該字符串將被作為空格;如果該參數沒有提供(或者為null)將沒有空格。

描述

關于序列化,有下面五點注意事項:

1.非數組對象的屬性不能保證以特定的順序出現在序列化后的字符串中。
2.布爾值、數字、字符串的包裝對象在序列化過程中會自動轉換成對應的原始值。
3.undefined、任意的函數以及 symbol 值,在序列化過程中會被忽略(出現在非數組對象的屬性值中時)或者被轉換成 null(出現在數組中時)。
4.所有以 symbol 為屬性鍵的屬性都會被完全忽略掉,即便 replacer 參數中強制指定包含了它們。
5.不可枚舉的屬性會被忽略

JSON.stringify({});                        // '{}'
JSON.stringify(true);                      // 'true'
JSON.stringify("foo");                     // '"foo"'
JSON.stringify([1, "false", false]);       // '[1,"false",false]'
JSON.stringify({ x: 5 });                  // '{"x":5}'

JSON.stringify({x: 5, y: 6});              
// "{"x":5,"y":6}"

JSON.stringify([new Number(1), new String("false"), new Boolean(false)]); 
// '[1,"false",false]'

JSON.stringify({x: undefined, y: Object, z: Symbol("")}); 
// '{}'

JSON.stringify([undefined, Object, Symbol("")]);          
// '[null,null,null]' 

JSON.stringify({[Symbol("foo")]: "foo"});                 
// '{}'

JSON.stringify({[Symbol.for("foo")]: "foo"}, [Symbol.for("foo")]);
// '{}'

JSON.stringify(
    {[Symbol.for("foo")]: "foo"}, 
    function (k, v) {
        if (typeof k === "symbol"){
            return "a symbol";
        }
    }
);


// undefined 

// 不可枚舉的屬性默認會被忽略:
JSON.stringify( 
    Object.create(
        null, 
        { 
            x: { value: 'x', enumerable: false }, 
            y: { value: 'y', enumerable: true } 
        }
    )
);

// "{"y":"y"}"

replacer參數

function replacer(key,value){
      if(typeof value === "string"){
          return undefined;
    }
    return value;
}
var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
var jsonString = JSON.stringify(foo,replacer);
返回:{"week":45,"month":7};

//如果replacer是一個數組,數組的值代表將被序列化成JSON字符串的屬性名
JSON.stringify(foo,["model","transport"]);
返回: '{"model":"box","transport":"car"}';
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容