<dl></dl>
<dd></dd>
json(javascript object notation) 是一種輕量級的資料交換格式。它基于ecmascript的一個子集。 json采用完全獨立于語言的文本格式,但是也使用了類似于c語言家族的習慣(包括c、c++、c#、java、javascript、perl、python等)。這些特性使json成為理想的資料交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成(一般用于提升網絡傳輸速率)。
<dt>中文名</dt>
<dd>javascript 對象表示法</dd>
<dt>外文名</dt>
<dd>javascript object notation</dd>
<dt>縮 寫</dt>
<dd>json</dd>
<dt>學 科</dt>
<dd>資訊技術</dd>
<dt>發 音</dt>
<dd>ˈdʒeɪsən</dd>
1 json 文法
▪ json 文法規則
▪ json 名稱/值對
▪ json 值
2 基礎結構
3 基礎示例
▪ 名稱 / 值對
▪ 表示數組
4 格式應用
▪ 指派給變量
▪ 通路資料
▪ 修改資料
▪ 換回字元串
▪ json嵌套格式
5 具體形式
6 概念比較
▪ 和xml的比較
▪ 執行個體比較
7 校驗工具
▪ 前言
▪ 功能
▪ json的最小化
編輯
json 文法是 javascript 對象表示文法的子集。
資料在鍵值對中
資料由逗号分隔
花括号儲存對象
方括号儲存數組
json 資料的書寫格式是:名稱/值對。
名稱/值對組合中的名稱寫在前面(在雙引号中),值對寫在後面(同樣在雙引号中),中間用冒号隔開:
1
"firstname":"john"
這很容易了解,等價于這條 javascript 語句:
firstname="john"
json 值可以是:
數字(整數或浮點數)
字元串(在雙引号中)
邏輯值(true 或 false)
數組(在方括号中)
對象(在花括号中)
null
json[1] 結構有兩種結構[2]
json簡單說就是javascript中的對象和數組,是以這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種複雜的結構。
1、對象:對象在js中表示為“{}”括起來的内容,資料結構為 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,是以很容易了解,取值方法為 對象.key 擷取屬性值,這個屬性值的類型可以是 數字、字元串、數組、對象幾種。
2、數組:數組在js中是中括号“[]”括起來的内容,資料結構為 ["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引擷取,字段值的類型可以是 數字、字元串、數組、對象幾種。
經過對象、數組2種結構就可以組合成複雜的資料結構了。
簡單地說[2] ,json 可以将 javascript 對象中表示的一組資料轉換為字元串,然後就可以在函數之間輕松地傳遞這個字元串,或者在異步應用程式中将字元串從 web 客戶機傳遞給伺服器端程式。這個字元串看起來有點兒古怪,但是javascript很容易解釋它,而且 json 可以表示比"名稱 / 值對"更複雜的結構。例如,可以表示數組和複雜的對象,而不僅僅是鍵和值的簡單清單。
按照最簡單的形式,可以用下面這樣的 json 表示"名稱 / 值對":
{"firstname":"brett"}
這個示例非常基本,而且實際上比等效的純文字"名稱 / 值對"占用更多的空間:
firstname=brett
但是,當将多個"名稱 / 值對"串在一起時,json 就會展現出它的價值了。首先,可以建立包含多個"名稱 / 值對"的 記錄,比如:
{"firstname":"brett","lastname":"mclaughlin","email":"aaaa"}
從文法方面來看,這與"名稱 / 值對"相比并沒有很大的優勢,但是在這種情況下 json 更容易使用,而且可讀性更好。例如,它明确地表示以上三個值都是同一記錄的一部分;花括号使這些值有了某種聯系。
當需要表示一組值時,json 不但能夠提高可讀性,而且可以減少複雜性。例如,假設您希望表示一個人名清單。在xml中,需要許多開始标記和結束标記;如果使用典型的名稱 / 值對(就像在本系列前面文章中看到的那種名稱 / 值對),那麼必須建立一種專有的資料格式,或者将鍵名稱修改為 person1-firstname這樣的形式。
如果使用 json,就隻需将多個帶花括号的記錄分組在一起:
2
3
4
5
6
7
{
"people":[
{"firstname":"brett","lastname":"mclaughlin","email":"aaaa"},
{"firstname":"jason","lastname":"hunter","email":"bbbb"},
{"firstname":"elliotte","lastname":"harold","email":"cccc"}
]
}
這不難了解。在這個示例中,隻有一個名為 people的變量,值是包含三個條目的數組,每個條目是一個人的記錄,其中包含名、姓和電子郵件位址。上面的示例示範如何用括号将記錄組合成一個值。當然,可以使用相同的文法表示多個值(每個值包含多個記錄):
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
"programmers": [{
"firstname": "brett",
"lastname": "mclaughlin",
"email": "aaaa"
}, {
"firstname": "jason",
"lastname": "hunter",
"email": "bbbb"
"firstname": "elliotte",
"lastname": "harold",
"email": "cccc"
}],
"authors": [{
"firstname": "isaac",
"lastname": "asimov",
"genre": "sciencefiction"
"firstname": "tad",
"lastname": "williams",
"genre": "fantasy"
"firstname": "frank",
"lastname": "peretti",
"genre": "christianfiction"
"musicians": [{
"firstname": "eric",
"lastname": "clapton",
"instrument": "guitar"
"firstname": "sergei",
"lastname": "rachmaninoff",
"instrument": "piano"
}]
這裡最值得注意的是,能夠表示多個值,每個值進而包含多個值。但是還應該注意,在不同的主條目(programmers、authors 和 musicians)之間,記錄中實際的名稱 / 值對可以不一樣。json 是完全動态的,允許在 json 結構的中間改變表示資料的方式。
在處理 json 格式的資料時,沒有需要遵守的預定義的限制。是以,在同樣的資料結構中,可以改變表示資料的方式,甚至可以以不同方式表示同一事物。
掌握了 json 格式之後,在 javascript 中使用它就很簡單了。json 是 javascript 原生格式,這意味着在 javascript 中處理 json 資料不需要任何特殊的 api 或工具包。
例如,可以建立一個新的 javascript 變量,然後将 json 格式的資料字元串直接指派給它:
var people = {
};
這非常簡單;people包含前面看到的 json 格式的資料。但是,這還不夠,因為通路資料的方式似乎還不明顯。
盡管看起來不明顯,但是上面的長字元串實際上隻是一個數組;将這個數組放進 javascript變量之後,就可以很輕松地通路它。實際上,隻需用點号表示法來表示數組元素。是以,要想通路 programmers 清單的第一個條目的姓氏,隻需在 javascript 中使用下面這樣的代碼:
people.programmers[0].lastname;
注意,數組索引是從零開始的。是以,這行代碼首先通路 people變量中的資料;然後移動到稱為 programmers的條目,再移動到第一個記錄([0]);最後,通路 lastname鍵的值。結果是字元串值 “mclaughlin”。
下面是使用同一變量的幾個示例。
people.authors[1].genre // value is "fantasy"
people.musicians[3].lastname // undefined. this refers to the fourth entry, and there isn't one
people.programmers[2].firstname // value is "elliotte"
利用這樣的文法,可以處理任何 json 格式的資料,而不需要使用任何額外的 javascript 工具包或 api。
正如可以用點号和方括号通路資料,也可以按照同樣的方式輕松地修改資料:
people.musicians[1].lastname="rachmaninov";
在将字元串轉換為 javascript 對象之後,就可以像這樣修改變量中的資料。
最終結論是,如果要處理大量 javascript 對象,那麼 json 是一個好選擇,這樣就可以輕松地将資料轉換為可以在請求中發送給伺服器端程式的格式。
許多javascript樹形控件使用json嵌套格式描述樹形結構,如下所示:
38
{
id: '100000',
text: '廊坊銀行總行',
children: [
{
id: '110000',
text: '廊坊分行',
children: [
{
id: '113000',
text: '廊坊銀行開發區支行',
leaf: true
},
id: '112000',
text: '廊坊銀行解放道支行',
children: [
{
id: '112200',
text: '廊坊銀行三大街支行',
leaf: true
},
id: '112100',
text: '廊坊銀行廣陽道支行',
}
]
id: '111000',
text: '廊坊銀行金光道支行',
}
]
}
]
}
關于json嵌套格式可以搜尋百度詞條:“多叉樹”。
1、對象是一個無序的“‘名稱/值’對”集合。
(1)一個對象以“{”(左括号)開始,“}”(右括号)結束。
(2)每個“名稱”後跟一個“:”(冒号);
(3)“‘名稱/值’ 對”之間使用“,”(逗号)分隔。(如圖所示,圖中表示資料的方式是類似非确定性自動機的形式,沒學過編譯原理的人,可能了解起來困難點,實際上也是正規表達式的形式。下同)
例子:表示人的一個對象:
"姓名":"大憨",
"年齡":24
2、數組是值(value)的有序集合。
(1)一個數組以“[”(左中括号)開始,“]”(右中括号)結束。
(2)值之間使用“,”(逗号)分隔。
例子:一組學生
"學生": [
{"姓名":"小明","年齡":23},
{"姓名":"大憨","年齡":24}
說明:此json對象包括了一個學生數組,而學生數組中的值又是兩個json對象。
3、值(value)可以是雙引号括起來的字元串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。
4、字元串(string)是由雙引号包圍的任意數量unicode字元的集合,使用反斜線轉義。一個字元(character)即一個單獨的字元串(character string)。 字元串(string)與c或者java的字元串非常相似。
5、數值(number)也與c或者java的數值非常相似。除去未曾使用的八進制與十六進制格式。除去一些編碼細節。
可讀性
json和xml的可讀性可謂不相上下,一邊是簡易的文法,一邊是規範的标簽形式,很難分出勝負。
可擴充性
xml天生有很好的擴充性,json當然也有,沒有什麼是xml可以擴充而json卻不能擴充的。不過json在javascript主場作戰,可以存儲javascript複合對象,有着xml不可比拟的優勢。
編碼難度
xml有豐富的編碼工具,比如dom4j、jdom等,json也有提供的工具。無工具的情況下,相信熟練的開發人員一樣能很快的寫出想要的xml文檔和json字元串,不過,xml文檔要多很多結構上的字元。
解碼難度
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那樣需要有嚴格的閉合标簽,這就讓有效資料量與總資料包比大大提升,進而減少同等資料流量的情況下,網絡的傳輸壓力[3] 。
xml和json都使用結構化方法來标記資料,下面來做一個簡單的比較。
用xml表示中國部分省市資料如下:
<?xml version="1.0" encoding="utf-8"?>
<country>
<name>中國</name>
<province>
<name>黑龍江</name>
<cities>
<city>哈爾濱</city>
<city>大慶</city>
</cities>
</province>
<name>廣東</name>
<city>廣州</city>
<city>深圳</city>
<city>珠海</city>
<name>台灣</name>
<city>台北</city>
<city>高雄</city>
<name>新疆</name>
<city>烏魯木齊</city>
</country>
用json表示如下:
"name": "中國",
"province": [{
"name": "黑龍江",
"cities": {
"city": ["哈爾濱", "大慶"]
}
"name": "廣東",
"city": ["廣州", "深圳", "珠海"]
"name": "台灣",
"city": ["台北", "高雄"]
"name": "新疆",
"city": ["烏魯木齊"]
編碼的可讀性,xml有明顯的優勢,畢竟人類的語言更貼近這樣的說明結構。json讀起來更像一個資料塊,讀起來就比較費解了。不過,我們讀起來費解的語言,恰恰是适合機器閱讀,是以通過json的索引.province[0].name就能夠讀取“黑龍江”這個值。
編碼的手寫難度來說,xml還是舒服一些,好讀當然就好寫。不過寫出來的字元json就明顯少很多。去掉空白制表以及換行的話,json就是密密麻麻的有用資料,而xml卻包含很多重複的标記字元。
json格式取代了xml給網絡傳輸帶來了很大的便利,但是卻沒有了xml的一目了然,尤其是json資料很長的時候,我們會陷入繁瑣複雜的資料節點查找中。
但是國人的一款線上工具 bejson 、sojson線上工具讓衆多程式員、新接觸json格式的程式員更快的了解json的結構,更快的精确定位json格式錯誤。
1 json格式化校驗[4]
很多人在得到json資料後,一時沒有辦法判斷json資料格式是否正确,是否少或多符号而導緻程式不能解析,這個功能正好能幫助大家來完成json格式的校驗。
2 json視圖
想必很多程式員都會遇到當找一個節點的時候,會發現如果直接對着一行行資料無從下手,就算知道哪個位置,還要一個節點一個節點的往下找,萬一一不留神又得從頭開始找的麻煩事。
有了這個功能,一切json資料都會變成視圖格式,一目了然,什麼對象下有多少數組,一個數組下有多少對象。
這個功能非常實用。不光有視圖功能還有格式化、壓縮、轉義、校驗功能。總之很強大。
3 壓縮轉義
程式員在寫json語句測試用例的時候,很多時候為了友善直接寫了個json字元串做測試,但是又陷入了無止境的雙引号轉義的麻煩中。這款功能集壓縮、轉義于一身,讓你在寫測試用例的時候,如魚得水。
4 json線上編輯器[4]
如果你現在的電腦剛巧沒有裝你所熟悉的編輯器,如果你想針對拿到的json資料的某個節點做資料修改時,這個功能可以滿足你的需求。
5 線上發送json資料
大家都知道,json用的最多的還是web項目的開發,那你要測試一個接口是否能準确的接受json資料,那你就得寫一個頁面發送json字元串,重複的做着這件事。随着這個功能的橫空出世,你可以擺脫寫測試頁面了,因為這個功能可以将指定的json資料發送指定的url,友善吧。
6 json着色
很多人在寫文檔時,總希望文檔能一目了然,但是面對着白底黑字的json資料總是提不起精神沒關系,使用這個功能,所有的關鍵字都[1] 會被着色,資料結構一目了然。
7 json-xml互轉
顧名思義,将json格式的資料轉化成xml[1] 格式、或者xml格式的資料轉化成json格式,一切都不是問題。
8 json-view
json檢視實用工具,在開發過程中(windows平台中)可以對json資料進行格式化和視圖顯示。
9 它和xml一樣都是一種資料交換格式
eclipse rap的一個送出者也是上司者的ralf sternberg,他隻用了十個類就把快速的和輕量級的庫整合到了一起。顯然,使用精益和解析法真正地改善了伺服器的性能,因為伺服器程序以更高的效率為大量的客戶建立了json資訊。在外部json中不存在依賴關系,代碼很容易管理,而且也不會占用很多記憶體。對于你的全部json項目來說,這還遠遠不夠,但這确實帶來了幾件好事。[5]