> 原文出處:http://codecloud.net/core-json-tutorial-6735.html
> 本文由[程序員的資料庫技術翻譯小組](http://codecloud.net/tech-article-translate-6591.html)翻譯,如有錯誤請幫忙更正,謝謝支持。
>
> 英文原文:[Core JSON](https://dzone.com/refcardz/core-json)
>
> 歡迎轉載,轉載請務必保留譯文出處和原文出處,謝謝合作!
[JSON(JavaScript Object Notation)](http://w3cschool.codecloud.net/json/what-is-json.html)是一種基于文本的標準數據交換格式,使應用程序通過計算機網絡交換數據。因為JSON獨立于編程語言和計算平臺,因此用Ruby ,[Java](http://w3cschool.codecloud.net/java/java-hello-world.html)/EE,Javascript,C#/.Net,PHP等編程語言寫的程序,可以很容易的消耗和產生JSON數據。而與JSON相關的API和工具十分豐富,這讓你很容易的將JSON運用在你喜愛的編程語言,IDE 和運行環境里。此外,流行的NoSQL數據庫,諸如MongoDB和ConchBase,都是基于JSON的。
在2001年,JSON被道格拉斯?克羅克福德創建,并在RFC4627與IETF(因特網工程任務組)標準中被規定;詳情見 http://tools.ietf.org/html/rfc4627。根據規范,JSON的IANA(互聯網數字分配機構)媒體類型是應用/json,文件類型是json。
## 什么是JSON?
JSON是一種簡單的數據格式,它有三種基本的數據結構:
* 鍵/值對。
* 對象。
* 數組。
有效的JSON文件總是被大括號圍繞,像這樣:
~~~
{ JSON-Data }
~~~
請注意,JSON社區的一些成員使用術語“字符串”而不是“文檔”來描述JSON 。
## 為什么要用JSON?
在因特網上,JSON正逐漸代替XML成為首選的數據交換格式,這是因為JSON容易閱讀并且它的結構匹配常見的編程概念,諸如對象和數組。JSON也比XML更高效(即更快的解析和網絡傳輸),這是因為JSON更緊湊——沒有開始和結束標簽。
### 鍵/值對
鍵/值對看起來像這樣:
~~~
{
"firstName": "John"
}
~~~
屬性名(即第一個名字)是被雙引號環繞的字符串。值可以是字符串(如上面的例子),但這僅是有效數據類型中的一組。(請查看數據類型章節獲取更多細節。)一些著名的科技公司申稱他們使用JSON數據格式,但是他們并不用引號環繞他們的字符串。然而,這不是有效的JSON;請查看JSON驗證章節獲得更多信息。
### 對象
對象是無序鍵/值對的集合。下面的例子展示了一個地址對象:
~~~
{
"address" : {
"line1" : "555 Main Street",
"city" : "Denver",
"stateOrProvince" : "CO",
"zipOrPostalCode" : "80202",
"country" : "USA"
}
}
~~~
對象(這里是指地址)被環繞在大括號里,由一對對被逗號分割的鍵/值對組成。
### 數組
數組是有序值的集合,數組看起來像這樣:
~~~
{
"people" : [
{ "firstName": "John", "lastName": "Smith", "age": 35 },
{ "firstName": "Jane", "lastName": "Smith", "age": 32 }
]
}
~~~
### 值類型
值(即鍵/值對右手邊的)可以是下列任一類型:
* 對象
* 數組
* 字符串
* 數字
* 布爾值
* null
數字 數字可以是整數或者雙精度浮點型。這里有一些例子: “age”: 29
~~~
"cost": 299.99
"temperature": -10.5
"speed_of_light": 1.23e11
"speed_of_light": 1.23e+11
"speed_of_light": 1.23E11
"speed_of_light": 1.23E+11
~~~
屬性名(如age等)是被雙引號環繞的字符串,但是值沒有引號。數字可以有負號。緊跟在數值后面的指數部分(記作e或E),可以選擇正負號。將0,八進制放在數值前是不被允許的,十六進制同樣不被允許 。
### 布爾值
在JSON里,布爾值要么是真,要么是假,如下:
~~~
{
"emailValidated" : true
}
~~~
屬性名(emailVaild)是被雙引號環繞的字符串,但是值(true)沒有引號。
### null
雖然從技術層面上說null不是一個數據類型,它是一個特殊的值,可以用來表示數據元素沒有值。在下面的例子里, 年齡的作用域沒有值(也許是因為用戶選擇不填寫這個信息):
~~~
{
"age" : null
}
~~~
### 注釋
JSON不允許有注釋。注釋原本是JSON的一部分,但是開發者將解析指令放入注釋中,這極大地濫用了它們。當道格拉斯?克羅克福德看見開發者如此實踐時,他從JSON里移除了注釋,以此保持計算機平臺的互操作性。
### 樣式
也許你已經注意到屬性名(及冒號的左邊)使用了駝峰命名法。這不是一個準則或者標準,但是一個約定俗稱的規定,這個規定被寫在在谷歌的JSON樣式指南里: http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml.
### 官方語法
道格拉斯?克羅克福德的JSON網站(http://www.json.org)提供了JSON語法的完整描述。
此外,JSON Pro Quick Guide (在iphone蘋果商店里可免費獲取)提供了樣例和JSON語法的概述。