複製鏈接
請複製以下鏈接發送給好友

JSON

鎖定
JSON(JavaScript Object Notation, JS對象簡譜)是一種輕量級的數據交換格式。它基於 ECMAScript(European Computer Manufacturers Association, 歐洲計算機協會制定的js規範)的一個子集,採用完全獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易於人閲讀和編寫,同時也易於機器解析和生成,並有效地提升網絡傳輸效率
中文名
JS鍵值對數據
外文名
JavaScript Object Notation
縮    寫
JSON
學    科
計算機工程
發    音
/ˈdʒeɪsən/

JSON簡要歷史

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。易於人閲讀和編寫,可以在多種語言之間進行數據交換 [5]  。同時也易於機器解析和生成。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。
JSON是Douglas Crockford在2001年開始推廣使用的數據格式,在2005年-2006年正式成為主流的數據格式,雅虎和谷歌就在那時候開始廣泛地使用JSON格式。

JSONJSON 語法

JSON語法規則

JSON是一個標記符的序列。這套標記符包含六個構造字符字符串數字和三個字面值
JSON是一個序列化的對象數組
1. 六個構造字符
begin-array = ws %x5B ws ; [ 左方括號
begin-object = ws %x7B ws ; { 左大括號
end-array = ws %x5D ws ; ] 右方括號
end-object = ws %x7D ws ; } 右大括號
name-separator = ws %x3A ws ; : 冒號
value-separator = ws %x2C ws ; , 逗號
2. 在這六個構造字符的前或後允許存在無意義的空白符(ws):
ws = *(%x20 /; 空間
%x09 /; 水平標籤
%x0A /; 換行或換行
%x0D); 回程
3.JSON的值:
JSON的構成: ws ws [1] 
可以是對象數組數字字符串或者三個字面值(false、null、true)中的一個。值中的字面值中的英文必須使用小寫
對象由花括號括起來的逗號分割的成員構成,成員是字符串鍵和上文所述的由逗號分割的鍵值對組成,如:
    {"name": "John Doe", "age": 18, "address": {"country" : "china", "zip-code": "10000"}}
JSON中的對象可以包含多個鍵值對,並且有數組結構,該語言正是一次實現過程內容的描述。 [6] 
數組是由方括號括起來的一組值構成,如:
[3, 1, 4, 1, 5, 9, 2, 6]
字符串與C或者Java的字符串非常相似。字符串是由雙引號包圍的任意數量Unicode字符的集合,使用反斜線轉義。一個字符(character)即一個單獨的字符串(character string)。
數字也與C或者Java的數值非常相似。除去未曾使用的八進制十六進制格式。除去一些編碼細節。 [2] 
一些合法的JSON的實例:
{"a": 1, "b": [1, 2, 3]}
[1, 2, "3", {"a": 4}]
3.14
"plain_text"

JSON與 JS 對象的關係

很多人搞不清楚 JSON 和 JS 對象的關係,甚至連誰是誰都不清楚。其實,可以這麼理解:
JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字符串。
var obj = {a: 'Hello', b: 'World'}; //這是一個對象,注意鍵名也是可以使用引號包裹的
var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質是一個字符串

JSON和 JS 對象互轉

要實現從JSON字符串轉換為JS對象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //結果是 {a: 'Hello', b: 'World'}
要實現從JS對象轉換為JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); //結果是 '{"a": "Hello", "b": "World"}'

JSON常用類型

任何支持的類型都可以通過 JSON 來表示,例如字符串、數字、對象、數組等。但是對象和數組是比較特殊且常用的兩種類型。
對象:對象在 JS 中是使用花括號包裹 {} 起來的內容,數據結構為 {key1:value1, key2:value2, ...} 的鍵值對結構。在面向對象的語言中,key 為對象的屬性,value 為對應的值。鍵名可以使用整數和字符串來表示。值的類型可以是任意類型。
數組:數組在 JS 中是方括號 [] 包裹起來的內容,數據結構為 ["java", "javascript", "vb", ...] 的索引結構。在 JS 中,數組是一種比較特殊的數據類型,它也可以像對象那樣使用鍵值對,但還是索引使用得多。同樣,值的類型可以是任意類型。

JSON基礎示例

簡單地説,JSON 可以將 JavaScript 對象中表示的一組數據轉換字符串,然後就可以在網絡或者程序之間輕鬆地傳遞這個字符串,並在需要的時候將它還原為各編程語言所支持的數據格式,例如在 PHP 中,可以將 JSON 還原為數組或者一個基本對象。在用到AJAX時,如果需要用到數組傳值,這時就需要用JSON將數組轉化為字符串。 [3] 

JSON表示對象

對象是一個無序的“‘名稱/值’對”集合。一個對象以{左括號開始,}右括號結束。每個“名稱”後跟一個:冒號;“‘名稱/值’ 對”之間使用,逗號分隔。
{"firstName": "Brett", "lastName": "McLaughlin"}                                        

JSON表示數組

和普通的 JS 數組一樣,JSON 表示數組的方式也是使用方括號 []。
{ 
"people":[ 
{
"firstName": "Brett",            
"lastName":"McLaughlin"        
},      
{        
"firstName":"Jason",
"lastName":"Hunter"
}
]
}
這不難理解。在這個示例中,只有一個名為 people的變量,值是包含兩個條目的數組,每個條目是一個人的記錄,其中包含名和姓。上面的示例演示如何用括號將記錄組合成一個值。當然,可以使用相同的語法表示更過多的值(每個值包含多個記錄)。
在處理 JSON 格式的數據時,沒有需要遵守的預定義的約束。所以,在同樣的數據結構中,可以改變表示數據的方式,也可以使用不同方式表示同一事物。
如前面所説,除了對象和數組,你也可以簡單地使用字符串或者數字等來存儲簡單的數據,但這樣並沒有多大意義。

JSON和XML的比較

JSON可讀性

JSON和XML的可讀性可謂不相上下,一邊是簡易的語法,一邊是規範的標籤形式,很難分出勝負。

JSON可擴展性

XML天生有很好的擴展性,JSON當然也有,沒有什麼是XML可以擴展而JSON卻不能擴展的。不過JSON在Javascript主場作戰,可以存儲Javascript複合對象,有着xml不可比擬的優勢。

JSON編碼難度

XML有豐富的編碼工具,比如Dom4j、Dom、SAX等,JSON也有提供的工具。無工具的情況下,相信熟練的開發人員一樣能很快的寫出想要的xml文檔和JSON字符串,不過,xml文檔要多很多結構上的字符。

JSON解碼難度

XML的解析方式有兩種:
一是通過文檔模型解析,也就是通過父標籤索引出一組標記。例如:xmlData.getElementsByTagName("tagName"),但是這樣是要在預先知道文檔結構的情況下使用,無法進行通用的封裝。
另外一種方法是遍歷節點(document 以及 childNodes)。這個可以通過遞歸來實現,不過解析出來的數據仍舊是形式各異,往往也不能滿足預先的要求。
凡是這樣可擴展的結構數據解析起來一定都很困難。
JSON也同樣如此。如果預先知道JSON結構的情況下,使用JSON進行數據傳遞簡直是太美妙了,可以寫出很實用美觀可讀性強的代碼。如果你是純粹的前台開發人員,一定會非常喜歡JSON。但是如果你是一個應用開發人員,就不是那麼喜歡了,畢竟xml才是真正的結構化標記語言,用於進行數據傳遞。
而如果不知道JSON的結構而去解析JSON的話,那簡直是噩夢。費時費力不説,代碼也會變得冗餘拖沓,得到的結果也不盡人意。但是這樣也不影響眾多前台開發人員選擇JSON。因為json.js中的toJSONString()就可以看到JSON的字符串結構。當然對於不是經常使用這個字符串的人,這樣做仍舊是噩夢。常用JSON的人看到這個字符串之後,就對JSON的結構很明瞭了,就更容易的操作JSON。
以上是在Javascript中僅對於數據傳遞的xml與JSON的解析。在Javascript地盤內,JSON畢竟是主場作戰,其優勢當然要遠遠優越於xml。如果JSON中存儲Javascript複合對象,而且不知道其結構的話,我相信很多程序員也一樣是哭着解析JSON的。
除了上述之外,JSON和XML還有另外一個很大的區別在於有效數據率。JSON作為數據包格式傳輸的時候具有更高的效率,這是因為JSON不像XML那樣需要有嚴格的閉合標籤,這就讓有效數據量與總數據包比大大提升,從而減少同等數據流量的情況下,網絡的傳輸壓力。

JSON實例比較

XML和JSON都使用結構化方法來標記數據,下面來做一個簡單的比較。
用XML表示中國部分省市數據如下:
<?xml version="1.0" encoding="utf-8"?>
<country>
    <name>中國</name>
    <province>
        <name>黑龍江</name>
        <cities>
            <city>哈爾濱</city>
            <city>大慶</city>
        </cities>
    </province>
    <province>
        <name>廣東</name>
        <cities>
            <city>廣州</city>
            <city>深圳</city>
            <city>珠海</city>
        </cities>
    </province>
    <province>
        <name>台灣</name>
        <cities>
            <city>台北</city>
            <city>高雄</city>
        </cities>
    </province>
    <province>
        <name>新疆</name>
        <cities>
            <city>烏魯木齊</city>
        </cities>
    </province>
</country>
用JSON表示如下:
{
    "name": "中國",
    "province": [{
        "name": "黑龍江",
        "cities": {
            "city": ["哈爾濱", "大慶"]
        }
    }, {
        "name": "廣東",
        "cities": {
            "city": ["廣州", "深圳", "珠海"]
        }
    }, {
        "name": "台灣",
        "cities": {
            "city": ["台北", "高雄"]
        }
    }, {
        "name": "新疆",
        "cities": {
            "city": ["烏魯木齊"]
        }
    }]
}
可以看到,JSON 簡單的語法格式和清晰的層次結構明顯要比 XML 容易閲讀,並且在數據交換方面,由於 JSON 所使用的字符要比 XML 少得多,可以大大得節約傳輸數據所佔用的帶寬。有不少研究表明JSON的傳輸效率高於XML。 [5] 

JSON校驗工具

JSON前言

JSON格式取代了xml給網絡傳輸帶來了很大的便利,但是卻沒有了xml的一目瞭然,尤其是json數據很長的時候,我們會陷入繁瑣複雜的數據節點查找中。
但是有很多工具能讓眾多程序員、新接觸JSON格式的程序員更快的瞭解JSON的結構,更快的精確定位JSON格式錯誤。

JSON功能

1 JSON格式化校驗
很多人在得到JSON數據後,一時沒有辦法判斷JSON數據格式是否正確,是否少或多符號而導致程序不能解析,這個功能正好能幫助大家來完成JSON格式的校驗。
2 JSON視圖
想必很多程序員都會遇到當找一個節點的時候,會發現如果直接對着一行行數據無從下手,就算知道哪個位置,還要一個節點一個節點的往下找,萬一一不留神又得從頭開始找的麻煩事。
有了這個功能,一切JSON數據都會變成視圖格式,一目瞭然,什麼對象下有多少數組,一個數組下有多少對象。
這個功能非常實用。不光有視圖功能還有格式化、壓縮、轉義、校驗功能。總之很強大。
3 壓縮轉義
程序員在寫JSON語句測試用例的時候,很多時候為了方便直接寫了個JSON字符串做測試,但是又陷入了無止境的雙引號轉義的麻煩中。這款功能集壓縮、轉義於一身,讓你在寫測試用例的時候,如魚得水。
4 JSON在線編輯器
如果你現在的電腦剛巧沒有裝你所熟悉的編輯器,如果你想針對拿到的JSON數據的某個節點做數據修改時,這個功能可以滿足你的需求。
5 在線發送JSON數據
大家都知道,JSON用的最多的還是web項目的開發,那你要測試一個接口是否能準確的接受JSON數據,那你就得寫一個頁面發送JSON字符串,重複的做着這件事。隨着這個功能的橫空出世,你可以擺脱寫測試頁面了,因為這個功能可以將指定的JSON數據發送指定的url,方便吧。
6 JSON着色
很多人在寫文檔時,總希望文檔能一目瞭然,但是面對着白底黑字的JSON數據總是提不起精神沒關係,使用這個功能,所有的關鍵字都會被着色,數據結構一目瞭然。
7 JSON-XML互轉
顧名思義,將JSON格式的數據轉化成XML格式、或者XML格式的數據轉化成JSON格式,一切都不是問題。
8 JSON-VIEW
JSON查看實用工具,在開發過程中(windows平台中)可以對JSON數據進行格式化和視圖顯示。
9 它和xml一樣都是一種數據交換格式

JSONJSON的最小化

Eclipse RAP的一個提交者也是領導者的Ralf Sternberg,他只用了十個類就把快速的和輕量級的庫整合到了一起。顯然,使用精益和解析法真正地改善了服務器的性能,因為服務器進程以更高的效率為大量的客户創建了JSON信息。在外部JSON中不存在依賴關係,代碼很容易管理,而且也不會佔用很多內存。對於你的全部JSON項目來説,這還遠遠不夠,但這確實帶來了幾件好事。 [4] 
參考資料