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