寫這篇文章的目的是常常看到開發人員說:把字符串轉化爲JSON對象
,把JSON對象
轉化成字符串等相似的話題,因此把以前收藏的一篇老外的文章整理翻譯了一下,供你們討論,若有錯誤,請你們指出,多謝。javascript
本文的主題是基於ECMAScript262-3
來寫的,2011年的262-5新規範增長了JSON對象,和咱們平時所說的JSON有關係,可是不是同一個東西,文章最後一節會講到新增長的JSON對象。html
英文原文:http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/java
我想給你們澄清一下一個很是廣泛的誤解,我認爲不少JavaScript
開發人員都錯誤地把JavaScript對象
字面量(Object Literals)稱爲JSON對象(JSON Objects),由於他的語法和JSON規範裏描述的同樣,可是該規範裏也明確地說了JSON只是一個數據交換語言,只有咱們將之用在string
上下文的時候它才叫JSON
。jquery
JSON(JavaScript Object Notation)是一種由道格拉斯·克羅克福特構想設計、輕量級的數據交換語言,以文字爲基礎,且易於讓人閱讀。儘管JSON是Javascript的一個子集,但JSON是獨立於語言的文本格式,而且採用了相似於C語言家族的一些習慣。git
詳細定義:https://zh.wikipedia.org/wiki/JSONgithub
兩個個程序(或服務器、語言等)須要交互通訊的時候,他們傾向於使用string
字符串由於string
在不少語言裏解析的方式都差很少。複雜的數據結構常常須要用到,而且經過各類各樣的中括號{},小括號(),叫括號<>和空格來組成,這個字符串僅僅是按照要求規範好的字符。json
爲此,咱們爲了描述這些複雜的數據結構做爲一個string
字符串,制定了標準的規則和語法。JSON
只是其中一種語法,它能夠在string
上下文裏描述對象,數組,字符串,數字,布爾型和null,而後經過程序間傳輸,而且反序列化成所須要的格式。YAML和XML(甚至request params)也是流行的數據交換格式,可是,咱們喜歡JSON,誰叫咱們是JavaScript開發人員呢!segmentfault
引用Mozilla Developer Center裏的幾句話,供你們參考:數組
字面值:字面值是由語法表達式定義的常量;或,經過由必定字辭組成的語詞表達式定義的常量。 (Literals瀏覽器
字符串字面值能夠包含有零個或多個字符,由雙引號(")對或單引號(‘)對包圍。字符串被限定在同種引號之間;也即,必須是成對單引號或成對雙引號。(Strings Literals)
對象字面值是封閉在花括號對({})中的一個對象的零個或多個"屬性名-值"對的(元素)列表。(Object Literals)
JSON是設計成描述數據交換格式的,他也有本身的語法,這個語法是JavaScript
的一個子集。
{ "prop": "val" } 這樣的聲明有多是JavaScript對象字面量
也有多是JSON字符串
,取決於在什麼上下文使用它,若是是用在string上下文
(用單引號或雙引號引住,或者從text文件讀取)的話,那它就是JSON字符串
,若是是用在對象字面量上下文中,那它就是對象字面量。
// 這是JSON字符串 var foo = '{ "prop": "val" }'; // 這是對象字面量 var bar = { "prop": "val" };
並且要注意,JSON
有很是嚴格的語法,在string上下文裏{ "prop": "val" }
是個合法的JSON,但{ prop: "val" }
和{ 'prop': 'val' }
倒是不合法的。全部屬性名稱和它的值都必須用雙引號引住,不能使用單引號。另外,即使你用了轉義之後的單引號也是不合法的,詳細的語法規則能夠到這裏查看。
你們夥可能嗤之以鼻:難道JavaScript代碼不是一個大的字符串?
固然是,全部的JavaScript
代碼和HTML
(可能還有其餘東西)都是字符串,直到瀏覽器對他們進行解析。這時候.js
文件或者inline
的JavaScript
代碼已經不是字符串了,而是被當成真正的JavaScript
源代碼了,就像頁面裏的innterHTML
同樣,這時候也不是字符串了,而是被解析成DOM
結構了。
再次說一下,這取決於上下文,在string
上下文裏使用帶有大括號的JavaScript
對象,那它就是JSON
字符串,而若是在對象字面量上下文裏使用的話,那它就是對象字面量。
開頭已經提到,對象字面量不是JSON對象,可是有真正的JSON對象。可是二者徹底不同概念,在現代的瀏覽器裏JSON對象已經被原生的內置對象了,目前有2個靜態方法:JSON.parse()
用來將JSON字符串反序列化成對象,JSON.stringify()
用來將對象序列化成JSON字符串
。老版本的瀏覽器(如ie6)不支持這個對象,但你能夠經過json2.js或者json3.js來實現一樣的功能。
若是還不理解,別擔憂,參考一下的例子就知道了:
// 這是JSON字符串,好比從AJAX獲取字符串信息 var my_json_string = '{ "prop": "val" }'; // 將字符串反序列化成對象 var my_obj = JSON.parse( my_json_string ); alert( my_obj.prop == 'val' ); // 提示 true, 和想象的同樣! // 將對象序列化成JSON字符串 var my_other_json_string = JSON.stringify( my_obj );
另外,Paul Irish提到Douglas Crockford在JSON RFC裏用到了「JSON object」,可是在那個上下文裏,他的意思是「對象描述成JSON字符串」不是「對象字面量」。
若是你想了解更多關於JSON的資料,下面的鏈接對你絕對有用:
本文轉自TOM大叔的深刻理解JavaScript系列。聲明一下,本人全部整理的文章均不是照搬全抄,加入本身的理解和詳細的註解,以及修改了一些語病錯字等。
【深刻理解JavaScript系列】文章,包括了原創,翻譯,轉載,整理等各種型文章,原文是TOM大叔的一個很是不錯的專題,現將其從新整理髮布。謝謝大叔。若是你以爲本文不錯,請幫忙點個推薦,支持一把,感激涕零。
更多優秀文章歡迎關注個人專欄