JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。
它使得人們很容易的進(jìn)行閱讀和編寫。同時(shí)也方便了機(jī)器進(jìn)行解析和生成。
它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一個(gè)子集。
JSON采用完全獨(dú)立于程序語(yǔ)言的文本格式,但是也使用了類C語(yǔ)言的習(xí)慣
(包括C, C , C#, Java, JavaScript, Perl, Python等)。
這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言。
JSON[1] 結(jié)構(gòu)有兩種結(jié)構(gòu)[2]
json簡(jiǎn)單說(shuō)就是javascript中的對(duì)象和數(shù)組,所以這兩種結(jié)構(gòu)就是對(duì)象和數(shù)組兩種結(jié)構(gòu),
通過(guò)這兩種結(jié)構(gòu)可以表示各種復(fù)雜的結(jié)構(gòu)
1、對(duì)象:對(duì)象在js中表示為“{}”括起來(lái)的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 {key:value,key:value,...}的鍵值對(duì)的結(jié)構(gòu),
在面向?qū)ο蟮恼Z(yǔ)言中,key為對(duì)象的屬性,value為對(duì)應(yīng)的屬性值,所以很容易理解,取值方法為 對(duì)象.key 獲取屬性值,這個(gè)屬性值的類型可以是 數(shù)字、字符串、數(shù)組、對(duì)象幾種。
2、數(shù)組:數(shù)組在js中是中括號(hào)“[]”括起來(lái)的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為["java","javascript","vb",...]
,取值方式和所有語(yǔ)言中一樣,使用索引獲取,
字段值的類型可以是 數(shù)字、字符串、數(shù)組、對(duì)象幾種。
{
"JsonsList": {
"Jsons": [
{
"name": "Jsons.cn",
"age":26
},
{
"name": "www.hnxxbl.cn",
"age": 25
}
]
}
“名稱/值”對(duì)的集合(A collection of name/value pairs)。
不同的編程語(yǔ)言中,它被理解為對(duì)象(object),紀(jì)錄(record),
結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash table),
有鍵列表(keyed list),或者關(guān)聯(lián)數(shù)組 (associative array)。
值的有序列表(An ordered list of values)。
在大部分語(yǔ)言中,它被實(shí)現(xiàn)為數(shù)組(array),矢量(vector),列表(list),序列(sequence)。
這些都是常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)。目前,絕大部分編程語(yǔ)言都以某種形式支持它們。這使得在各種編程語(yǔ)言之間交換同樣格式的數(shù)據(jù)成為可能。
對(duì)象(object) 是一個(gè)無(wú)序的“‘名稱/值’對(duì)”集合。
一個(gè)對(duì)象以“{”(左括號(hào))開(kāi)始,“}”(右括號(hào))結(jié)束。
每個(gè)“名稱”后跟一個(gè)“:”(冒號(hào));“‘名稱/值’ 對(duì)”之間使用“,”(逗號(hào))分隔。
數(shù)組(array) 是值(value)的有序集合。
一個(gè)數(shù)組以“[”(左中括號(hào))開(kāi)始,“]”(右中括號(hào))結(jié)束。
值之間使用“,”(逗號(hào))分隔。
字符串(string) 是由雙引號(hào)包圍的任意數(shù)量Unicode字符的集合,使用反斜線轉(zhuǎn)義。
一個(gè)字符(character)即一個(gè)單獨(dú)的字符串(character string)。
數(shù)值(number) 也與C或者Java的數(shù)值非常相似。
只是JSON的數(shù)值沒(méi)有使用八進(jìn)制與十六進(jìn)制格式。
同時(shí),可以在任意標(biāo)記之間添加空白。
盡管看起來(lái)不明顯,但是上面的長(zhǎng)字符串實(shí)際上只是一個(gè)數(shù)組;
將這個(gè)數(shù)組放進(jìn) JavaScript變量之后,就可以很輕松地訪問(wèn)它。
實(shí)際上,只需用點(diǎn)號(hào)表示法來(lái)表示數(shù)組元素。
所以,要想訪問(wèn) programmers 列表的第一個(gè)條目的姓氏,只需在 JavaScript 中使用下面這樣的代碼:
people.programmers[0].lastName;
注意,數(shù)組索引是從零開(kāi)始的。所以,這行代碼首先訪問(wèn) people變量中的數(shù)據(jù);
然后移動(dòng)到稱為 programmers的條目,再移動(dòng)到第一個(gè)記錄([0]);最后,訪問(wèn) lastName鍵的值。
結(jié)果是字符串值 “McLaughlin”。
下面是使用同一變量的幾個(gè)示例。
people.authors[1].genre//Valueis"fantasy"people.musicians[3].lastName//Undefined.Thisreferstothefourthentry,andthereisn'tone
people.programmers[2].firstName//Valueis"Elliotte"
利用這樣的語(yǔ)法,可以處理任何 JSON 格式的數(shù)據(jù),而不需要使用任何額外的 JavaScript 工具包或 API。
和XML的比較
可讀性
JSON和XML的可讀性可謂不相上下,一邊是簡(jiǎn)易的語(yǔ)法,一邊是規(guī)范的標(biāo)簽形式,很難分出勝負(fù)。
可擴(kuò)展性
XML天生有很好的擴(kuò)展性,JSON當(dāng)然也有,沒(méi)有什么是XML可以擴(kuò)展而JSON卻不能擴(kuò)展的。
不過(guò)JSON在Javascript主場(chǎng)作戰(zhàn),可以存儲(chǔ)Javascript復(fù)合對(duì)象,有著xml不可比擬的優(yōu)勢(shì)。
編碼難度XML有豐富的編碼工具,比如Dom4j、JDom等,JSON也有提供的工具。
無(wú)工具的情況下,相信熟練的開(kāi)發(fā)人員一樣能很快的寫出想要的xml文檔和JSON字符串,
不過(guò),xml文檔要多很多結(jié)構(gòu)上的字符。
解碼難度XML的解析方式有兩種:
xmlData.getElementsByTagName("tagName"),
但是這樣是要在預(yù)先知道文檔結(jié)構(gòu)的情況下使用,無(wú)法進(jìn)行通用的封裝。
另外一種方法是遍歷節(jié)點(diǎn)(document 以及 childNodes)。
這個(gè)可以通過(guò)遞歸來(lái)實(shí)現(xiàn),不過(guò)解析出來(lái)的數(shù)據(jù)仍舊是形式各異,往往也不能滿足預(yù)先的要求。
凡是這樣可擴(kuò)展的結(jié)構(gòu)數(shù)據(jù)解析起來(lái)一定都很困難。JSON也同樣如此。
如果預(yù)先知道JSON結(jié)構(gòu)的情況下,使用JSON進(jìn)行數(shù)據(jù)傳遞簡(jiǎn)直是太美妙了,
可以寫出很實(shí)用美觀可讀性強(qiáng)的代碼。如果你是純粹的前臺(tái)開(kāi)發(fā)人員,一定會(huì)非常喜歡JSON。
但是如果你是一個(gè)應(yīng)用開(kāi)發(fā)人員,就不是那么喜歡了,畢竟xml才是真正的結(jié)構(gòu)化標(biāo)記語(yǔ)言,用于進(jìn)行數(shù)據(jù)傳遞。
而如果不知道JSON的結(jié)構(gòu)而去解析JSON的話,那簡(jiǎn)直是噩夢(mèng)。
費(fèi)時(shí)費(fèi)力不說(shuō),代碼也會(huì)變得冗余拖沓,得到的結(jié)果也不盡人意。
但是這樣也不影響眾多前臺(tái)開(kāi)發(fā)人員選擇JSON。
因?yàn)閖son.js中的toJSONString()就可以看到JSON的字符串結(jié)構(gòu)。
當(dāng)然不是使用這個(gè)字符串,這樣仍舊是噩夢(mèng)。
常用JSON的人看到這個(gè)字符串之后,就對(duì)JSON的結(jié)構(gòu)很明了了,就更容易的操作JSON。
以上是在Javascript中僅對(duì)于數(shù)據(jù)傳遞的xml與JSON的解析。
在Javascript地盤內(nèi),JSON畢竟是主場(chǎng)作戰(zhàn),其優(yōu)勢(shì)當(dāng)然要遠(yuǎn)遠(yuǎn)優(yōu)越于xml。
如果JSON中存儲(chǔ)Javascript復(fù)合對(duì)象,而且不知道其結(jié)構(gòu)的話,我相信很多程序員也一樣是哭著解析JSON的。
除了上述之外,JSON和XML還有另外一個(gè)很大的區(qū)別在于有效數(shù)據(jù)率。
JSON作為數(shù)據(jù)包格式傳輸?shù)臅r(shí)候具有更高的效率,
這是因?yàn)镴SON不像XML那樣需要有嚴(yán)格的閉合標(biāo)簽,這就讓有效數(shù)據(jù)量與總數(shù)據(jù)包比大大提升,
從而減少同等數(shù)據(jù)流量的情況下,網(wǎng)絡(luò)的傳輸壓力。
原文鏈接:什么是Json字符串?Json解析基礎(chǔ)概念講解