JSON是一種輕量級的數據交換格式,全稱——JavaScript 對象表示法(JavaScript Object Notation)。
類比XML,你可以把JSON看作是一種存儲數據的格式類型,一種數據規范。
描述JSON格式數據的語法采用了JS對象字面量的表示方法,但是你不能的把JS對象就看做是JSON了,同XML一樣JSON只是一種存儲數據的類型,它是獨立於語言存在的,只是在不同的編程語言中對這種數據類型的實現不同,例如在JavaScript中使用JavaScript對象對這種數據格式進行實現,那么在java中當然是用java對象實現。
同時,既然JSON這種數據格式用JS對象字面量的表示方法進行描述,那么描述JSON的語法就是JS對象字面量表示法語法的一個子集。如下圖所示:
下面我們看一下js對象的字面量表示法,及JSON格式的數據是怎么用這種語法實現的。
<script type="text/javascript">
//這是一個js對象,屬性不加"",符合js對象的字面量表示法語法但不符合JSON語法。 var jsObj1 = { name : "張三" }
//這是一個內部帶有方法js對象,雖然屬性加了"",但JSON的語法中屬性的值不能是方法。 var jsObj2 = { "name" : "張三", "func" : function(){ alert("hello"); } }
//這是一個符合JSON數據格式的js對象,是JavaScript語言中對JSON這種數據格式的實現形式,也是我們常說的"JSON對象"。
//這種JS對象字面量的表示方法,也就是"JSON對於其數據形式規范的語法",所以說"JSON的語法就是JS對象字面量表示法語法的一個子集"。 var jsonObj = { "name" : "張三", "age" : 10,
"remark" :{ "high" : 170 ,"address" : "beijinghaidian" }
}
</script>
其實對於"js對象的字面量表示法"中屬性加不加引號是"js對象"還是"JSON對象的說法本身就是錯誤的,加與不加引號它都是"js對象",只是你加了引號以后,從語法上來說符合JSON的語法規則,而JSON的語法規則又是"js對象的字面量表示法"語法規則的子集,所以無論怎么表示,他都是一個"js對象"。那么有沒有屬性必須要加引號的情況呢?我們知道js對於變量的命名規則是數字、字母、下划線及$符號,屬性不加引號時也符合這個規則,但要是屬性中有這四種之外其它的符號如"[" 或者 "."等等,屬性就必須引號來表示。
說到底,JSON是一種數據格式,一種對於數據的規范,因為其居有自我描述性及簡潔的語法規則,讓它成為了一種在不同語言之間理想的數據交換的格式,JSON獨立於語言而存在,任何站在語言的角度及對象層面對他的解釋都是有局限性或者是錯誤的。
參考文章:
(1):http://www.json.org.cn/index.htm
(2):http://www.w3school.com.cn/json/json_syntax.asp
最后說一點,我們作為程序員,研究問題還是要仔細深入一點的。當你對原理了解的有夠透徹,開發起來也就得心應手了,很多開發中的問題和疑惑也就迎刃而解了,而且在面對其他問題的時候也可做到觸類旁通。當然在開發中沒有太多的時間讓你去研究原理,開發中要以實現功能為前提,可等項目上線的后,你有大把的時間或者空余的時間,你大可去刨根問底,深入的去研究一項技術,為覺得這對一名程序員的成長是很重要的事情。