今個(gè)去面試巾乳,一個(gè)人事經(jīng)理問我xml和json的區(qū)別我沒答上來感覺很難過,于是就回來后就查閱相關(guān)資料寫點(diǎn)東西::
1.定義介紹
(1).XML定義擴(kuò)展標(biāo)記語言 (Extensible Markup Language, XML) ,用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言偷溺,可以用來標(biāo)記數(shù)據(jù)划煮、定義數(shù)據(jù)類型裆操,是一種允許用戶對(duì)自己的標(biāo)記語言進(jìn)行定義的源語言官地。 XML使用DTD(document type definition)文檔類型定義來組織數(shù)據(jù);格式統(tǒng)一,跨平臺(tái)和語言烙懦,早已成為業(yè)界公認(rèn)的標(biāo)準(zhǔn)驱入。XML是標(biāo)準(zhǔn)通用標(biāo)記語言 (SGML) 的子集,非常適合 Web 傳輸。XML 提供統(tǒng)一的方法來描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)亏较。
(2).JSON定義JSON(JavaScript Object Notation)一種輕量級(jí)的數(shù)據(jù)交換格式莺褒,具有良好的可讀和便于快速編寫的特性⊙┣椋可在不同平臺(tái)之間進(jìn)行數(shù)據(jù)交換遵岩。JSON采用兼容性很高的、完全獨(dú)立于語言文本格式巡通,同時(shí)也具備類似于C語言的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)體系的行為尘执。這些特性使JSON成為理想的數(shù)據(jù)交換語言。JSON基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一個(gè)子集宴凉。
2.XML和JSON優(yōu)缺點(diǎn)
(1).XML的優(yōu)缺點(diǎn)
<1>.XML的優(yōu)點(diǎn)
A.格式統(tǒng)一誊锭,符合標(biāo)準(zhǔn);
B.容易與其他系統(tǒng)進(jìn)行遠(yuǎn)程交互弥锄,數(shù)據(jù)共享比較方便丧靡。
<2>.XML的缺點(diǎn)
A.XML文件龐大,文件格式復(fù)雜籽暇,傳輸占帶寬温治;
B.服務(wù)器端和客戶端都需要花費(fèi)大量代碼來解析XML,導(dǎo)致服務(wù)器端和客戶端代碼變得異常復(fù)雜且不易維護(hù)戒悠;
C.客戶端不同瀏覽器之間解析XML的方式不一致熬荆,需要重復(fù)編寫很多代碼;
D.服務(wù)器端和客戶端解析XML花費(fèi)較多的資源和時(shí)間救崔。
(2).JSON的優(yōu)缺點(diǎn)
<1>.JSON的優(yōu)點(diǎn):
A.數(shù)據(jù)格式比較簡單惶看,易于讀寫,格式都是壓縮的六孵,占用帶寬形忱琛;
B.易于解析劫窒,客戶端JavaScript可以簡單的通過eval()進(jìn)行JSON數(shù)據(jù)的讀缺窘瘛;
C.支持多種語言主巍,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服務(wù)器端語言冠息,便于服務(wù)器端的解析;
D.在PHP世界孕索,已經(jīng)有PHP-JSON和JSON-PHP出現(xiàn)了逛艰,偏于PHP序列化后的程序直接調(diào)用,PHP服務(wù)器端的對(duì)象搞旭、數(shù)組等能直接生成JSON格式散怖,便于客戶端的訪問提裙矫唷;
E.因?yàn)镴SON格式能直接為服務(wù)器端代碼使用镇眷,大大簡化了服務(wù)器端和客戶端的代碼開發(fā)量咬最,且完成任務(wù)不變,并且易于維護(hù)欠动。
<2>.JSON的缺點(diǎn)
A.沒有XML格式這么推廣的深入人心和喜用廣泛永乌,沒有XML那么通用性;
B.JSON格式目前在Web Service中推廣還屬于初級(jí)階段具伍。
3.XML和JSON的優(yōu)缺點(diǎn)對(duì)比
(1).可讀性方面翅雏。JSON和XML的數(shù)據(jù)可讀性基本相同,JSON和XML的可讀性可謂不相上下沿猜,一邊是建議的語法枚荣,一邊是規(guī)范的標(biāo)簽形式,XML可讀性較好些啼肩。
(2).可擴(kuò)展性方面橄妆。XML天生有很好的擴(kuò)展性,JSON當(dāng)然也有祈坠,沒有什么是XML能擴(kuò)展害碾,JSON不能的。
(3).編碼難度方面赦拘。XML有豐富的編碼工具慌随,比如Dom4j、JDom等躺同,JSON也有json.org提供的工具阁猜,但是JSON的編碼明顯比XML容易許多,即使不借助工具也能寫出JSON的代碼蹋艺,可是要寫好XML就不太容易了剃袍。
(4).解碼難度方面。XML的解析得考慮子節(jié)點(diǎn)父節(jié)點(diǎn)捎谨,讓人頭昏眼花民效,而JSON的解析難度幾乎為0。這一點(diǎn)XML輸?shù)恼媸菦]話說涛救。
(5).流行度方面畏邢。XML已經(jīng)被業(yè)界廣泛的使用,而JSON才剛剛開始检吆,但是在Ajax這個(gè)特定的領(lǐng)域舒萎,未來的發(fā)展一定是XML讓位于JSON。到時(shí)Ajax應(yīng)該變成Ajaj(Asynchronous Javascript and JSON)了蹭沛。
(6).解析手段方面逆甜。JSON和XML同樣擁有豐富的解析手段虱肄。
(7).數(shù)據(jù)體積方面。JSON相對(duì)于XML來講交煞,數(shù)據(jù)的體積小,傳遞的速度更快些斟或。
(8).數(shù)據(jù)交互方面素征。JSON與JavaScript的交互更加方便,更容易解析處理萝挤,更好的數(shù)據(jù)交互御毅。
(9).數(shù)據(jù)描述方面。JSON對(duì)數(shù)據(jù)的描述性比XML較差怜珍。
(10).傳輸速度方面端蛆。JSON的速度要遠(yuǎn)遠(yuǎn)快于XML。
4.XML與JSON數(shù)據(jù)格式比較
(1).關(guān)于輕量級(jí)和重量級(jí)輕量級(jí)和重量級(jí)是相對(duì)來說的酥泛,那么XML相對(duì)于JSON的重量級(jí)體現(xiàn)在哪呢?應(yīng)該體現(xiàn)在解析上今豆,XML目前設(shè)計(jì)了兩種解析方式:DOM和 SAX。<1>.DOMDOM是把一個(gè)數(shù)據(jù)交換格式XML看成一個(gè)DOM對(duì)象柔袁,需要把XML文件整個(gè)讀入內(nèi)存呆躲,這一點(diǎn)上JSON和XML的原理是一樣的,但是XML要考慮父節(jié)點(diǎn)和子節(jié)點(diǎn)捶索,這一點(diǎn)上JSON的解析難度要小很多插掂,因?yàn)镴SON構(gòu)建于兩種結(jié)構(gòu):key/value,鍵值對(duì)的集合;值的有序集合腥例,可理解為數(shù)組辅甥;
<2>.SAXSAX不需要整個(gè)讀入文檔就可以對(duì)解析出的內(nèi)容進(jìn)行處理,是一種逐步解析的方法燎竖。程序也可以隨時(shí)終止解析璃弄。這樣,一個(gè)大的文檔就可以逐步的底瓣、一點(diǎn)一點(diǎn)的展現(xiàn)出來谢揪,所以SAX適合于大規(guī)模的解析。這一點(diǎn)捐凭,JSON目前是做不到得拨扶。所以,JSON和XML的輕/重量級(jí)的區(qū)別在于:JSON只提供整體解析方案茁肠,而這種方法只在解析較少的數(shù)據(jù)時(shí)才能起到良好的效果患民;XML提供了對(duì)大規(guī)模數(shù)據(jù)的逐步解析方案,這種方案很適合于對(duì)大量數(shù)據(jù)的處理垦梆。
(2).關(guān)于數(shù)據(jù)格式編碼及解析難度
<1>.在編碼方面匹颤。雖然XML和JSON都有各自的編碼工具仅孩,但是JSON的編碼要比XML簡單,即使不借助工具印蓖,也可以寫出JSON代碼辽慕,但要寫出好的XML代碼就有點(diǎn)困難;與XML一樣,JSON也是基于文本的赦肃,且它們都使用Unicode編碼溅蛉,且其與數(shù)據(jù)交換格式XML一樣具有可讀性。主觀上來看他宛,JSON更為清晰且冗余更少些船侧。JSON網(wǎng)站提供了對(duì)JSON語法的嚴(yán)格描述,只是描述較簡短厅各。從總體來看镜撩,XML比較適合于標(biāo)記文檔,而JSON卻更適于進(jìn)行數(shù)據(jù)交換處理队塘。
<2>.在解析方面袁梗。在普通的web應(yīng)用領(lǐng)域,開發(fā)者經(jīng)常為XML的解析傷腦筋人灼,無論是服務(wù)器端生成或處理XML围段,還是客戶端用 JavaScript 解析XML,都常常導(dǎo)致復(fù)雜的代碼投放,極低的開發(fā)效率奈泪。實(shí)際上,對(duì)于大多數(shù)Web應(yīng)用來說灸芳,他們根本不需要復(fù)雜的XML來傳輸數(shù)據(jù)涝桅,XML宣稱的擴(kuò)展性在此就很少具有優(yōu)勢,許多Ajax應(yīng)用甚至直接返回HTML片段來構(gòu)建動(dòng)態(tài)Web頁面。和返回XML并解析它相比烙样,返回HTML片段大大降低了系統(tǒng)的復(fù)雜性冯遂,但同時(shí)缺少了一定的靈活性。同XML或 HTML片段相比谒获,數(shù)據(jù)交換格式JSON 提供了更好的簡單性和靈活性蛤肌。在Web Serivice應(yīng)用中,至少就目前來說XML仍有不可動(dòng)搖的地位批狱。
(3).實(shí)例比較XML和JSON都使用結(jié)構(gòu)化方法來標(biāo)記數(shù)據(jù)裸准,下面來做一個(gè)簡單的比較。
[
{
"length" : "12",
"url" : "http://127.0.0.1/resources/videos/minion_01.mp4",
"image" : "http://127.0.0.1/resources/images/minion_01.png",
"ID" : "01",
"name" : "小黃人 第01部"
},
{
"length" : "14",
"url" : "http://127.0.0.1/resources/videos/minion_02.mp4",
"image" : "http://127.0.0.1/resources/images/minion_02.png",
"ID" : "02",
"name" : "小黃人 第02部"
},
{
"length" : "16",
"url" : "http://127.0.0.1/resources/videos/minion_03.mp4",
"image" : "http://127.0.0.1/resources/images/minion_03.png",
"ID" : "03",
"name" : "小黃人 第03部"
},
{
"length" : "18",
"url" : "http://127.0.0.1/resources/videos/minion_04.mp4",
"image" : "http://127.0.0.1/resources/images/minion_04.png",
"ID" : "04",
"name" : "小黃人 第04部"
},
{
"length" : "20",
"url" : "http://127.0.0.1/resources/videos/minion_05.mp4",
"image" : "http://127.0.0.1/resources/images/minion_05.png",
"ID" : "05",
"name" : "小黃人 第05部"
},
{
"length" : "22",
"url" : "http://127.0.0.1/resources/videos/minion_06.mp4",
"image" : "http://127.0.0.1/resources/images/minion_06.png",
"ID" : "06",
"name" : "小黃人 第06部"
},
{
"length" : "24",
"url" : "http://127.0.0.1/resources/videos/minion_07.mp4",
"image" : "http://127.0.0.1/resources/images/minion_07.png",
"ID" : "07",
"name" : "小黃人 第07部"
},
{
"length" : "26",
"url" : "http://127.0.0.1/resources/videos/minion_08.mp4",
"image" : "http://127.0.0.1/resources/images/minion_08.png",
"ID" : "08",
"name" : "小黃人 第08部"
},
{
"length" : "28",
"url" : "http://127.0.0.1/resources/videos/minion_09.mp4",
"image" : "http://127.0.0.1/resources/images/minion_09.png",
"ID" : "09",
"name" : "小黃人 第09部"
},
{
"length" : "30",
"url" : "http://127.0.0.1/resources/videos/minion_10.mp4",
"image" : "http://127.0.0.1/resources/images/minion_10.png",
"ID" : "10",
"name" : "小黃人 第10部"
},
{
"length" : "32",
"url" : "http://127.0.0.1/resources/videos/minion_11.mp4",
"image" : "http://127.0.0.1/resources/images/minion_11.png",
"ID" : "11",
"name" : "小黃人 第11部"
},
{
"length" : "34",
"url" : "http://127.0.0.1/resources/videos/minion_12.mp4",
"image" : "http://127.0.0.1/resources/images/minion_12.png",
"ID" : "12",
"name" : "小黃人 第12部"
},
{
"length" : "36",
"url" : "http://127.0.0.1/resources/videos/minion_13.mp4",
"image" : "http://127.0.0.1/resources/images/minion_13.png",
"ID" : "13",
"name" : "小黃人 第13部"
},
{
"length" : "38",
"url" : "http://127.0.0.1/resources/videos/minion_14.mp4",
"image" : "http://127.0.0.1/resources/images/minion_14.png",
"ID" : "14",
"name" : "小黃人 第14部"
},
{
"length" : "40",
"url" : "http://127.0.0.1/resources/videos/minion_15.mp4",
"image" : "http://127.0.0.1/resources/images/minion_15.png",
"ID" : "15",
"name" : "小黃人 第15部"
},
{
"length" : "42",
"url" : "http://127.0.0.1/resources/videos/minion_16.mp4",
"image" : "http://127.0.0.1/resources/images/minion_16.png",
"ID" : "16",
"name" : "小黃人 第16部"
}
]
XML
<?xml version="1.0" encoding="UTF-8"?>
<vedios>
<vedio ID = "01" name = "小黃人 第01部" length = "12" image = "http://127.0.0.1/resources/images/minion_01.png" url = "http://127.0.0.1/resources/videos/minion_01.mp4" />
<vedio ID = "02" name = "小黃人 第02部" length = "14" image = "http://127.0.0.1/resources/images/minion_02.png" url = "http://127.0.0.1/resources/videos/minion_02.mp4" />
<vedio ID = "03" name = "小黃人 第03部" length = "16" image = "http://127.0.0.1/resources/images/minion_03.png" url = "http://127.0.0.1/resources/videos/minion_03.mp4" />
<vedio ID = "04" name = "小黃人 第04部" length = "18" image = "http://127.0.0.1/resources/images/minion_04.png" url = "http://127.0.0.1/resources/videos/minion_04.mp4" />
<vedio ID = "05" name = "小黃人 第05部" length = "10" image = "http://127.0.0.1/resources/images/minion_05.png" url = "http://127.0.0.1/resources/videos/minion_05.mp4" />
<vedio ID = "06" name = "小黃人 第06部" length = "12" image = "http://127.0.0.1/resources/images/minion_06.png" url = "http://127.0.0.1/resources/videos/minion_06.mp4" />
<vedio ID = "07" name = "小黃人 第07部" length = "16" image = "http://127.0.0.1/resources/images/minion_07.png" url = "http://127.0.0.1/resources/videos/minion_07.mp4" />
<vedio ID = "08" name = "小黃人 第08部" length = "18" image = "http://127.0.0.1/resources/images/minion_08.png" url = "http://127.0.0.1/resources/videos/minion_08.mp4" />
<vedio ID = "09" name = "小黃人 第09部" length = "20" image = "http://127.0.0.1/resources/images/minion_09.png" url = "http://127.0.0.1/resources/videos/minion_09.mp4" />
<vedio ID = "10" name = "小黃人 第10部" length = "12" image = "http://127.0.0.1/resources/images/minion_10.png" url = "http://127.0.0.1/resources/videos/minion_10.mp4" />
<vedio ID = "11" name = "小黃人 第11部" length = "13" image = "http://127.0.0.1/resources/images/minion_11.png" url = "http://127.0.0.1/resources/videos/minion_11.mp4" />
<vedio ID = "12" name = "小黃人 第12部" length = "12" image = "http://127.0.0.1/resources/images/minion_12.png" url = "http://127.0.0.1/resources/videos/minion_12.mp4" />
<vedio ID = "13" name = "小黃人 第13部" length = "11" image = "http://127.0.0.1/resources/images/minion_13.png" url = "http://127.0.0.1/resources/videos/minion_13.mp4" />
<vedio ID = "14" name = "小黃人 第14部" length = "15" image = "http://127.0.0.1/resources/images/minion_14.png" url = "http://127.0.0.1/resources/videos/minion_14.mp4" />
<vedio ID = "15" name = "小黃人 第15部" length = "14" image = "http://127.0.0.1/resources/images/minion_15.png" url = "http://127.0.0.1/resources/videos/minion_15.mp4" />
<vedio ID = "16" name = "小黃人 第16部" length = "18" image = "http://127.0.0.1/resources/images/minion_16.png" url = "http://127.0.0.1/resources/videos/minion_16.mp4" />
</vedios>
編碼的可讀性來說赔硫,XML有明顯的優(yōu)勢炒俱,畢竟人類的語言更貼近這樣的說明結(jié)構(gòu)。JSON讀起來更像一個(gè)數(shù)據(jù)塊,讀起來就比較費(fèi)解了权悟。不過砸王,我們讀起來費(fèi)解的語言,恰恰是適合機(jī)器閱讀峦阁,所以通過JSON的索引country.provinces[0].name就能夠讀取“黑龍江”這個(gè)值谦铃。編碼的手寫難度來說,XML還是舒服一些拇派,好讀當(dāng)然就好寫荷辕。不過寫出來的字符JSON就明顯少很多。去掉空白制表以及換行的話件豌,JSON就是密密麻麻的有用數(shù)據(jù),而XML卻包含很多重復(fù)的標(biāo)記字符控嗜。