JSON.parse()與JSON.stringify()的用法,以及eval()和new Function

estelle發表於2019-02-16

JSON.parse()

1、我們可以使用 JSON.parse() 方法將資料轉換為 JavaScript 物件。

語法

JSON.parse(text[, reviver])

引數說明:

text:必需, 一個有效的 JSON 字串。
reviver: 可選,一個轉換結果的函式, 將為物件的每個成員呼叫此函式。

2、JSON 解析例項

使用 JSON.parse 的 reviver 函式時一定要注意遍歷到最後的頂層物件 key 為 “”,需要返回 value。不然報錯

var json = `{"name":"Harvy", "age":36, "gender":"male"}`;
var person = JSON.parse(json, function (key, value) {
    if(key != "")
        return "<font color="blue">"+value+"</font>";
    else
        return value;
});

JSON 不能儲存 Date 物件。// Sat Dec 14 2013 08:00:00 GMT+0800 (中國標準時間)
如果你需要儲存 Date 物件,需要將其轉換為字串。// 2013-12-14
之後再將字串轉換為 Date 物件。// new Date(“2013-12-14”);

我們可以啟用 JSON.parse 的第二個引數 reviver,一個轉換結果的函式,物件的每個成員呼叫此函式。

例項

var text = `{ "name":"Runoob", "initDate":"2013-12-14", "site":"www.runoob.com"}`; 
var obj = JSON.parse(text, function (key, value) { 
if (key == "initDate") {
      return new Date(value);//將日期字串轉換為 Date 物件
 } else { 
return value; 
}
}); 
//Sat Dec 14 2013 08:00:00 GMT+0800 (中國標準時間)
document.getElementById("demo").innerHTML = obj.name + "建立日期:" + obj.initDate;

3、解析函式

JSON 不允許包含函式,但你可以將函式作為字串儲存,之後再將函式字串用eval解析。

例項

var text = `{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob.com"}`; 
var obj = JSON.parse(text); 
obj.alexa = eval("(" + obj.alexa + ")"); //用eval解析函式字串
document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();

4、eval()

除了JSON.parse(),以下二種方法也可以將json字串轉化為json 物件。

var str1 = `{ "name": "deyuyi", "sex": "man" }`;
console.log(eval("("+str1+")"));
console.log((new Function("","return "+str1))());
//str1 = { "name": "deyuyi", "sex": "man" }

Eval

由於json是以”{}”的方式來開始以及結束的,在JS中,{}會被當成一個語句塊來處理,加上圓括號的目的是迫使eval函式在處理JavaScript程式碼的時候強制將括號內的表示式(expression)轉化為物件,而不是作為語句(statement)來執行。

console.log(eval("{}"));// return undefined
console.log(eval("({})"));// return object[Object]

將age的值換成了Javascript程式碼,eval依然可以解析,假如有人惡意修改這個程式碼,那麼就會造成嚴重後果。
//例如:

var jsonData = `{"student" : [{"name":"鳴人","age":17}, {"name":"小櫻","age":alert("hehe")},{"name":"佐助","age":17}]}`;

//先彈出一個提示框輸出hehe的字串~

console.log(eval("("+jsonData+")"));

但JSON.parse會報錯。顯示錯誤資訊為當前字串不符合json格式~即JSON.parse()方法會檢查需要轉換的字串是否符合json格式~

相比較而言eval方法是很危險的~特別是當涉及到第三方時我們需要確保傳給eval的引數是我們可以控制的~
不然裡面插入比如window.location~指向一個惡意的連線~那就不好了
從這個層面講~還是推薦使用JSON.parse來實現json格式字串的解析。

//會報錯~顯示錯誤資訊為當前字串不符合json格式

console.log(JSON.parse(jsonData));

JSON.stringify()

我們可以使用 JSON.stringify() 方法將 JavaScript 物件轉換為字串。

1、語法

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

引數說明:

value:
必需, 一個有效的 JSON 物件。
replacer:
可選。用於轉換結果的函式或陣列。
如果 replacer 為函式,則 JSON.stringify 將呼叫該函式,並傳入每個成員的鍵和值。使用返回值而不是原始值。如果此函式返回 undefined,則排除成員。根物件的鍵是一個空字串:””。
如果 replacer 是一個陣列,則僅轉換該陣列中具有鍵值的成員。成員的轉換順序與鍵在陣列中的順序一樣。當 value 引數也為陣列時,將忽略 replacer 陣列。
space:
可選,文字新增縮排、空格和換行符,如果 space 是一個數字,則返回值文字在每個級別縮排指定數目的空格,如果 space 大於 10,則文字縮排 10 個空格。space 有可以使用非數字,如:t。

2、JavaScript 物件轉換

例項

var obj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com"}; 
document.write(obj);//[object Object] 
var myJSON = JSON.stringify(obj);
document.write(myJSON );
//輸出字串{"name":"runoob","alexa":10000,"site":"www.runoob.com"}

3、JavaScript 陣列轉換

例項

var arr = [ "Google", "Runoob", "Taobao", "Facebook" ]; 
document.write(arr);//Google,Runoob,Taobao,Facebook
var myJSON = JSON.stringify(arr);
document.write(myJSON );// [ "Google", "Runoob", "Taobao", "Facebook" ]

4、將Date 物件轉化為字串

JSON 不能儲存 Date 物件。
JSON.stringify() 會將所有日期轉換為字串。

例項

var obj = { "name":"Runoob", "initDate":new Date(), "site":"www.runoob.com"};
var myJSON = JSON.stringify(obj.initDate); 
document.write(myJSON );//"2018-11-08T03:00:40.443Z"

5、解析函式
JSON 不允許包含函式,JSON.stringify() 會刪除 JavaScript 物件的函式,包括 key 和 value。

例項

var obj = { "name":"Runoob", "alexa":function () {return 10000;}, "site":"www.runoob.com"}; 
var myJSON = JSON.stringify(obj);
document.write(myJSON );//{"name":"Runoob","site":"www.runoob.com"}

我們可以在執行 JSON.stringify() 函式前將函式轉換為字串來避免以上問題的發生:

例項

var obj = { "name":"Runoob", "alexa":function () {return 10000;}, "site":"www.runoob.com"}; 
obj.alexa = obj.alexa.toString(); //將函式轉換為字串
var myJSON = JSON.stringify(obj);
//{"name":"Runoob","alexa":"function () {return 10000;}","site":"www.runoob.com"}
 document.write(myJSON );

不建議在 JSON 中使用函式。

相關文章