json.parse json parse eval 區別 欄目 JSON 简体版
原文   原文鏈接

JSON.parse與eval和能將一個字符串解析成一個JSON對象,但仍是有挺大區別。javascript

測試代碼html

var A = "{  a: 1 , b : 'hello' }";
var B = "{  'a': 1 , 'b' : 'hello' }";
var C = "{'a':1,'b':'hello'}";
var D = '{"a":1,"b":"hello"}';
var E = '{ "a" : 1 , "b" : "hello" }';
var F = '{ "a" : 1 ,\n  "b" : "hello" }';
var G = '{ "a" : 1 , "b" : window.location.href="https://www.baidu.com" }';

  

JSON.parse執行:java

例:JSON.parse(A);jquery

A、B、C、G都不可轉,D、E、F均可以。json

eval執行:數組

例:eval("("+A+")");瀏覽器

A到G均可以轉,特別到G時,頁面還跳轉到百度了。安全

JSON.parse函數

上面的演示例子能夠看出,這方法只能解析屬性名是雙引號包裹的字符串對象,並會忽略換行和空格(值外面)。測試

可是,從MDN對JSON的描述,能解析的JSON字符串的條件完整以下:

JavaScript類型  JSON與之區別
對象和數組
屬性名稱必須用雙引號包裹;
最後一個屬性後面不能有逗號。
數值
前導0不能使用(在 JSON.stringify 中將會被忽略,在 JSON.parse 會拋出錯誤);
小數點後面至少有一個數字。
字符串
只有有限的字符可以被轉義;
不容許某些控制字符;但容許使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ;
字符串必須用雙引號括起來。

這方法還能夠捕捉JSON中的語法錯誤,並容許你傳入一個函數,用來過濾或轉換解析結果。

瀏覽器兼容:IE8+

eval

eval函數可將一個JavaScript代碼字符串求值成特定的對象,因此解析成JSON對象只不過是做用之一。

爲何eval()解析JSON字符串要加上括號?

緣由是兩點:

1. json對象是以」{}」的方式來開始以及結束的,在JS中,它會被當成一個語句塊來處理。

2. 加上圓括號爲了處理字符串爲表達式,而不是語句(statement)來執行。

例子:

對象字面量 {},不加外層的括號,那麼eval會識別爲JS代碼塊的開始和結束標記,那麼 {} 將會被認爲是執行了一句空語句。

alert(eval("{}")); // return undefined
alert(eval("({})"));// return object[Object]

不建議使用

雖然從演示例子看,eval的能力是強過於JSON.parse的,它可解析不規範的JSON字符串,可是G的例子也能夠看出,eval是不安全的,特別是數據是第三方給予時候,你根本不知道eval以後它會幹什麼。

因此結論就是,乖乖用JSON.parse解析JSON對象。

$.parseJSON

jQuery也有提供解析JSON字符串的方法,$.parseJSON ,就目前jQuery版原本講,分爲兩類。

2.x和3.x版本: $.parseJSON 都是直接使用 JSON.parse 的。

1.x版本:瀏覽器支持 JSON.parse 就用這個,不支持就進行校驗,確認是JSON字符串,則用

  ( Function( "return " + str ) )()

返回對象,不然返回無效JSON對象error。

PS:之因此能用Function處理,前提是校驗確認爲JSON字符串,否則仍是不安全的轉換方法。

 

總結

eval是強烈不建議用來解析JSON字符串,可是凡事無絕對,若是數據來源於你信任的而且格式也不大規範,那用它也不是不能夠。

 

參考文獻

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

2. https://code.jquery.com/jquery-1.12.4.js


本文爲轉載文章,轉自地址 :http://www.cnblogs.com/lovesong/p/6036650.html

相關文章
相關標籤/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
本站公眾號
   歡迎關注本站公眾號,獲取更多信息