溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

XML的對手 JSON是什么

發(fā)布時間:2020-07-14 10:34:39 來源:億速云 閱讀:178 作者:Leah 欄目:編程語言

這篇文章運(yùn)用簡單易懂的例子給大家介紹XML的對手 JSON是什么 ,代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

                                                           JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式

它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集。

JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。

這些特性使JSON成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機(jī)器解析和生成(網(wǎng)絡(luò)傳輸速度)。

JSON 語法

JSON 語法規(guī)則

JSON 語法是 JavaScript 對象表示語法的子集。

  • 數(shù)據(jù)在名稱/值對中

  • 數(shù)據(jù)由逗號分隔

  • 花括號保存對象

  • 方括號保存數(shù)組

JSON 名稱/值對

JSON 數(shù)據(jù)的書寫格式是:名稱/值對。

名稱/值對組合中的名稱寫在前面(在雙引號中),值對寫在后面(同樣在雙引號中),中間用冒號隔開:

"firstName":"John"


這很容易理解,等價于這條 JavaScript 語句:

firstName="John"

JSON 值可以是:JSON 值

  • 數(shù)字(整數(shù)或浮點(diǎn)數(shù))

  • 字符串(在雙引號中)

  • 邏輯值(true 或 false)

  • 數(shù)組(在方括號中)

  • 對象(在花括號中)

  • null

2基礎(chǔ)結(jié)構(gòu)

JSON結(jié)構(gòu)有兩種結(jié)構(gòu)

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ù)組、對象幾種。

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

3基礎(chǔ)示例

簡單地說,JSON 可以將 JavaScript 對象中表示的一組數(shù)據(jù)轉(zhuǎn)換為字符串,然后就可以在函數(shù)之間輕松地傳遞這個字符串,或者在異步應(yīng)用程序中將字符串從 Web 客戶機(jī)傳遞給服務(wù)器端程序。這個字符串看起來有點(diǎn)兒古怪,但是JavaScript很容易解釋它,而且 JSON 可以表示比"名稱 / 值對"更復(fù)雜的結(jié)構(gòu)。例如,可以表示數(shù)組和復(fù)雜的對象,而不僅僅是鍵和值的簡單列表。

名稱 / 值對

按照最簡單的形式,可以用下面這樣的 JSON 表示"名稱 / 值對":

"firstName":"Brett"}

這個示例非?;荆覍?shí)際上比等效的純文本"名稱 / 值對"占用更多的空間:

firstName=Brett


但是,當(dāng)將多個"名稱 / 值對"串在一起時,JSON 就會體現(xiàn)出它的價值了。首先,可以創(chuàng)建包含多個"名稱 / 值對"的 記錄,比如:

{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}

表示數(shù)組從語法方面來看,這與"名稱 / 值對"相比并沒有很大的優(yōu)勢,但是在這種情況下 JSON 更容易使用,而且可讀性更好。例如,它明確地表示以上三個值都是同一記錄的一部分;花括號使這些值有了某種聯(lián)系。

當(dāng)需要表示一組值時,JSON 不但能夠提高可讀性,而且可以減少復(fù)雜性。例如,假設(shè)您希望表示一個人名列表。在XML中,需要許多開始標(biāo)記和結(jié)束標(biāo)記;如果使用典型的名稱 / 值對(就像在本系列前面文章中看到的那種名稱 / 值對),那么必須建立一種專有的數(shù)據(jù)格式,或者將鍵名稱修改為 person1-firstName這樣的形式。

如果使用 JSON,就只需將多個帶花括號的記錄分組在一起:

{
"people":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
]
}


這不難理解。在這個示例中,只有一個名為 people的
變量,值是包含三個條目的數(shù)組,每個條目是一個人的記錄,其中包含名、姓和電子郵件地址。上面的示例演示如何用括號將記錄組合成一個值。當(dāng)然,可以使用相同的語法表示多個值(每個值包含多個記錄):

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


在處理 JSON 格式的數(shù)據(jù)時,沒有需要遵守的預(yù)定義的約束。所以,在同樣的數(shù)據(jù)結(jié)構(gòu)中,可以改變表示數(shù)據(jù)的方式,甚至可以以不同方式表示同一事物。
這里最值得注意的是,能夠表示多個值,每個值進(jìn)而包含多個值。但是還應(yīng)該注意,在不同的主條目(programmers、authors 和 musicians)之間,記錄中實(shí)際的名稱 / 值對可以不一樣。JSON 是完全動態(tài)的,允許在 JSON 結(jié)構(gòu)的中間改變表示數(shù)據(jù)的方式。

4格式應(yīng)用

掌握了 JSON 格式之后,在 JavaScript 中使用它就很簡單了。JSON 是 JavaScript 原生格式,這意味著在 JavaScript 中處理 JSON 數(shù)據(jù)不需要任何特殊的 API 或工具包。

賦值給變量

例如,可以創(chuàng)建一個新的 JavaScript 變量,然后將 JSON 格式的數(shù)據(jù)字符串直接賦值給它:

var people={"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"}
]}


這非常簡單;people包含前面看到的 JSON 格式的數(shù)據(jù)。但是,這還不夠,因?yàn)樵L問數(shù)據(jù)的方式似乎還不明顯。

訪問數(shù)據(jù)

盡管看起來不明顯,但是上面的長字符串實(shí)際上只是一個數(shù)組;將這個數(shù)組放進(jìn) JavaScript變量之后,就可以很輕松地訪問它。實(shí)際上,只需用點(diǎn)號表示法來表示數(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"


修改數(shù)據(jù)
利用這樣的語法,可以處理任何 JSON 格式的數(shù)據(jù),而不需要使用任何額外的 JavaScript 工具包或 API。

正如可以用點(diǎn)號和方括號訪問數(shù)據(jù),也可以按照同樣的方式輕松地修改數(shù)據(jù):

?

people.musicians[1].lastName="Rachmaninov";

換回字符串在將字符串轉(zhuǎn)換為 JavaScript 對象之后,就可以像這樣修改變量中的數(shù)據(jù)。

最終結(jié)是,如果要處理大量 JavaScript 對象,那么 JSON 是一個好選擇,這樣就可以輕松地將數(shù)據(jù)轉(zhuǎn)換為可以在請求中發(fā)送給服務(wù)器端程序的格式。

5具體形式

1、對象是一個無序的“‘名稱/值’對”集合。[3]

(1)一個對象以“{”(左括號)開始,“}”(右括號)結(jié)束。

(2)每個“名稱”后跟一個“:”(冒號);

(3)“‘名稱/值’ 對”之間使用“,”(逗號)分隔。(如圖所示,圖中表示數(shù)據(jù)的方式是類似非確定性自動機(jī)的形式,沒學(xué)過編譯原理的人,可能理解起來困難點(diǎn),實(shí)際上也是正則表達(dá)式的形式。下同)

XML的對手 JSON是什么

例子:表示人的一個對象:

{
"姓名":"大憨",
"年齡":24
}


(1)一個數(shù)組以“[”(左中括號)開始,“]”(右中括號)結(jié)束。
2、數(shù)組是值(value)的有序集合。

(2)值之間使用“,”(逗號)分隔。

例子:一組學(xué)生

{
"學(xué)生":
[
{"姓名":"小明","年齡":23},
{"姓名":"大憨","年齡":24}
]
}


說明:此Json對象包括了一個學(xué)生數(shù)組,而學(xué)生數(shù)組中的值又是兩個Json對象。

XML的對手 JSON是什么

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

XML的對手 JSON是什么

4、字符串(string)是由雙引號包圍的任意數(shù)量Unicode字符的集合,使用反斜線轉(zhuǎn)義。一個字符(character)即一個單獨(dú)的字符串(character string)。 字符串(string)與C或者Java的字符串非常相似。

XML的對手 JSON是什么

5、數(shù)值(number)也與C或者Java的數(shù)值非常相似。除去未曾使用的八進(jìn)制與十六進(jìn)制格式。除去一些編碼細(xì)節(jié)。

XML的對手 JSON是什么

6概念比較

和XML的比較

可讀性

JSON和XML的可讀性可謂不相上下,一邊是簡易的語法,一邊是規(guī)范的標(biāo)簽形式,很難分出勝負(fù)。

可擴(kuò)展性

XML天生有很好的擴(kuò)展性,JSON當(dāng)然也有,沒有什么是XML可以擴(kuò)展而JSON卻不能擴(kuò)展的。不過JSON在Javascript主場作戰(zhàn),可以存儲Javascript復(fù)合對象,有著xml不可比擬的優(yōu)勢。

編碼難度

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

解碼難度

XML的解析方式有兩種:

一是通過文檔模型解析,也就是通過父標(biāo)簽索引出一組標(biāo)記。例如:xmlData.getElementsByTagName("tagName"),但是這樣是要在預(yù)先知道文檔結(jié)構(gòu)的情況下使用,無法進(jìn)行通用的封裝。

另外一種方法是遍歷節(jié)點(diǎn)(document 以及 childNodes)。這個可以通過遞歸來實(shí)現(xiàn),不過解析出來的數(shù)據(jù)仍舊是形式各異,往往也不能滿足預(yù)先的要求。

凡是這樣可擴(kuò)展的結(jié)構(gòu)數(shù)據(jù)解析起來一定都很困難。

JSON也同樣如此。如果預(yù)先知道JSON結(jié)構(gòu)的情況下,使用JSON進(jìn)行數(shù)據(jù)傳遞簡直是太美妙了,可以寫出很實(shí)用美觀可讀性強(qiáng)的代碼。如果你是純粹的前臺開發(fā)人員,一定會非常喜歡JSON。但是如果你是一個應(yīng)用開發(fā)人員,就不是那么喜歡了,畢竟xml才是真正的結(jié)構(gòu)化標(biāo)記語言,用于進(jìn)行數(shù)據(jù)傳遞。

而如果不知道JSON的結(jié)構(gòu)而去解析JSON的話,那簡直是噩夢。費(fèi)時費(fèi)力不說,代碼也會變得冗余拖沓,得到的結(jié)果也不盡人意。但是這樣也不影響眾多前臺開發(fā)人員選擇JSON。因?yàn)閖son.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)然要遠(yuǎn)遠(yuǎn)優(yōu)越于xml。如果JSON中存儲Javascript復(fù)合對象,而且不知道其結(jié)構(gòu)的話,我相信很多程序員也一樣是哭著解析JSON的。

除了上述之外,JSON和XML還有另外一個很大的區(qū)別在于有效數(shù)據(jù)率。JSON作為數(shù)據(jù)包格式傳輸?shù)臅r候具有更高的效率,這是因?yàn)镴SON不像XML那樣需要有嚴(yán)格的閉合標(biāo)簽,這就讓有效數(shù)據(jù)量與總數(shù)據(jù)包比大大提升,從而減少同等數(shù)據(jù)流量的情況下,網(wǎng)絡(luò)的傳輸壓力[4] 。

實(shí)例比較

XML和JSON都使用結(jié)構(gòu)化方法來標(biāo)記數(shù)據(jù),下面來做一個簡單的比較。

用XML表示中國部分省市數(shù)據(jù)如下:

<?xmlversion="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":["烏魯木齊"]}}
           ]
}


編碼的手寫難度來說,xml還是舒服一些,好讀當(dāng)然就好寫。不過寫出來的
字符JSON就明顯少很多。去掉空白制表以及換行的話,JSON就是密密麻麻的有用數(shù)據(jù),而xml卻包含很多重復(fù)的標(biāo)記字符編碼的可讀性,xml有明顯的優(yōu)勢,畢竟人類的語言更貼近這樣的說明結(jié)構(gòu)。json讀起來更像一個數(shù)據(jù)塊,讀起來就比較費(fèi)解了。不過,我們讀起來費(fèi)解的語言,恰恰是適合機(jī)器閱讀,所以通過json的索引.province[0].name就能夠讀取“黑龍江”這個值。

7校驗(yàn)工具

前言

JSON格式取代了xml給網(wǎng)絡(luò)傳輸帶來了很大的便利,但是卻沒有了xml的一目了然,尤其是json數(shù)據(jù)很長的時候,我們會陷入繁瑣復(fù)雜的數(shù)據(jù)節(jié)點(diǎn)查找中。

但是國人的一款在線工具 BeJson 給眾多程序員帶來了一陣涼風(fēng)。

功能

1 JSON格式化校驗(yàn)

很多人在得到JSON數(shù)據(jù)后,一時沒有辦法判斷JSON數(shù)據(jù)格式是否正確,是否少或多符號而導(dǎo)致程序不能解析,這個功能正好能幫助大家來完成JSON格式的校驗(yàn)。

2 JSON視圖

想必很多程序員都會遇到當(dāng)找一個節(jié)點(diǎn)的時候,會發(fā)現(xiàn)如果直接對著一行行數(shù)據(jù)無從下手,就算知道哪個位置,還要一個節(jié)點(diǎn)一個節(jié)點(diǎn)的往下找,萬一一不留神又得從頭開始找的麻煩事。

有了這個功能,一切JSON數(shù)據(jù)都會變成視圖格式,一目了然,什么對象下有多少數(shù)組,一個數(shù)組下有多少對象。

這個功能非常實(shí)用。不光有視圖功能還有格式化、壓縮、轉(zhuǎn)義、校驗(yàn)功能。總之很強(qiáng)大。

3 壓縮轉(zhuǎn)義

程序員在寫JSON語句測試用例的時候,很多時候?yàn)榱朔奖阒苯訉懥藗€JSON字符串做測試,但是又陷入了無止境的雙引號轉(zhuǎn)義的麻煩中。這款功能集壓縮、轉(zhuǎn)義于一身,讓你在寫測試用例的時候,如魚得水。

4 JSON在線編輯器

如果你現(xiàn)在的電腦剛巧沒有裝你所熟悉的編輯器,如果你想針對拿到的JSON數(shù)據(jù)的某個節(jié)點(diǎn)做數(shù)據(jù)修改時,這個功能可以滿足你的需求。

5 在線發(fā)送JSON數(shù)據(jù)

大家都知道,JSON用的最多的還是web項(xiàng)目的開發(fā),那你要測試一個接口是否能準(zhǔn)確的接受JSON數(shù)據(jù),那你就得寫一個頁面發(fā)送JSON字符串,重復(fù)的做著這件事。隨著這個功能的橫空出世,你可以擺脫寫測試頁面了,因?yàn)檫@個功能可以將指定的JSON數(shù)據(jù)發(fā)送指定的url,方便吧。

6 JSON著色

很多人在寫文檔時,總希望文檔能一目了然,但是面對著白底黑字的JSON數(shù)據(jù)總是提不起精神沒關(guān)系,使用這個功能,所有的關(guān)鍵字都[1] 會被著色,數(shù)據(jù)結(jié)構(gòu)一目了然。

7 JSON-XML互轉(zhuǎn)

顧名思義,將JSON格式的數(shù)據(jù)轉(zhuǎn)化成XML[1] 格式、或者XML格式的數(shù)據(jù)轉(zhuǎn)化成JSON格式,一切都不是問題。

8 JSON-VIEW

JSON查看實(shí)用工具,在開發(fā)過程中(windows平臺中)可以對JSON數(shù)據(jù)進(jìn)行格式化和視圖顯示。

9 它和xml一樣都是一種數(shù)據(jù)交換格式

關(guān)于XML的對手 JSON是什么 就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI