JSON.parse與eval的區別

来源:http://www.cnblogs.com/zhilingege/archive/2017/05/10/6837843.html
-Advertisement-
Play Games

JSON.parse與eval和能將一個字元串解析成一個JSON對象,但還是有挺大區別。 測試代碼 JSON.parse執行: 例:JSON.parse(A); A、B、C、G都不可轉,D、E、F都可以。 eval執行: 例:eval("("+A+")"); A到G都可以轉,特別到G時,頁面還跳轉到 ...


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

測試代碼

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執行:

例:JSON.parse(A);

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 參考:http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html ...
  • 轉載請標明原文地址:http://www.cnblogs.com/zhangyukof/p/6829538.html 隨著編程經驗的積累,我對編程的理解也不斷的發生變化。最開始學的是演算法,然後是數據結構,現在開始學習編程思想,這是一個不斷進步的過程。編程思想可能是最基礎但卻是最重要的,以前對這些概念 ...
  • 一.簡介 ZK的安裝和配置十分簡單,既可以配置成單機模式,也可以配置成集群模式,zk使用java編寫的運行在java環境上,3個ZK服務進程是建議的最小進程數量,而且建議部署在不通的物理機上面,減少宕機帶來的風險。 二.下載並解壓 http://www.apache.org/dyn/closer.c ...
  • 收錄待用,修改轉載已取得 "騰訊雲" 授權 前言 在 web 前端開發中,我們會藉助 Grunt、Gulp 和 Webpack 等工具的 Watch 模塊去監聽文件變化,那服務端應該怎麼做?其實文件變化的監聽依然可以藉助構建工具,但我們還需要自動重啟服務或者熱重載。本文將介紹三種常見的方法。 方案一 ...
  • 收錄待用,修改轉載已取得 "騰訊雲" 授權 作者:kurtshen ES6 新增了幾種集合類型,本文主要介紹Set以及其使用。 其基本描述為 Set對象是值的集合,你可以按照插入的順序迭代它的元素。 Set中的元素只會出現一次,即 Set 中的元素是唯一的。 它的聲明 new Set([iterab ...
  • JavaScript面向對象的理解 筆記鏈接: http://pan.baidu.com/s/1c0hivuS 1:JavaScript 中分兩種對象,函數對象和普通對象new Function() 創建的對象都是函數對象、其他的都是普通對象。函數對象 例: 普通對象 例: 2:原型對象 JavaS ...
  • 效果預覽 首先,按照慣例,我們先看doT 實現的效果: 模板: {{? it.name }} <div>嗨, {{=it.name}}!</div> {{?? it.age 0}} <div>我猜應該還沒人給你起名字吧?</div> {{??}} 你已經 {{=it.age}} 歲了但是你還沒有名字 ...
  • FreeCodeCamp( FCC)前端工程師 基礎演算法練習 全解詳解 - 菜鳥的解答 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...