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基于兩種結(jié)構(gòu):

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
            }
        ]

}


經(jīng)過(guò)對(duì)象、數(shù)組2種結(jié)構(gòu)就可以組合成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)了。

“名稱/值”對(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ù)成為可能。


JSON具有以下這些形式:

對(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))分隔。


值(value) 可以是雙引號(hào)括起來(lái)的字符串(string)、數(shù)值(number)、true、false、 null、對(duì)象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套。

字符串(string) 是由雙引號(hào)包圍的任意數(shù)量Unicode字符的集合,使用反斜線轉(zhuǎn)義。

一個(gè)字符(character)即一個(gè)單獨(dú)的字符串(character string)。


Json的字符串(string)與C或者Java的字符串非常相似。

數(shù)值(number) 也與C或者Java的數(shù)值非常相似。

只是JSON的數(shù)值沒(méi)有使用八進(jìn)制與十六進(jìn)制格式。

同時(shí),可以在任意標(biāo)記之間添加空白。


訪問(wèn)數(shù)據(jù)

盡管看起來(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的解析方式有兩種:


一是通過(guò)文檔模型解析,也就是通過(guò)父標(biāo)簽索引出一組標(biāo)記。 例如:

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ǔ)概念講解