XML與JSON的對比
1、各自定義
XML
擴展標記語言 (Extensible Markup Language, XML) ,用於標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。 XML使用DTD(document type definition)文檔類型定義來組織數據;格式統一,跨平台和語言,早已成為業界公認的標准。
XML是標准通用標記語言 (SGML) 的子集,非常適合 Web 傳輸。XML 提供統一的方法來描述和交換獨立於應用程序或供應商的結構化數據。
JSON
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易於人閱讀和編寫。同時也易於機器解析和生成。 它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON采用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數據交換語言。
JSON建構於兩種結構:
“名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。
值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
關於JSON的更多描述,可見:http://json.org
2.XML和JSON對比
XML
1)應用廣泛,可擴展性強,被廣泛應用各種場合
2)讀取、解析沒有JSON快
3)可讀性強,可描述復雜結構
XML的應用已經深入人心,不再贅述。
JSON
1)結構簡單,都是鍵值對。
2)讀取、解析速度快,很多語言支持
3)傳輸數據量小,傳輸速率大大提高
4)描述復雜結構能力較弱
JavaScript、PHP等原生支持,簡化了讀取解析。成為當前互聯網時代普遍應用的數據結構。
3、XML與JSON轉換
常常會用到XML與JSON之間的轉換,在這里可以更加清晰了解兩者之間的區別。
1)常規轉換
常規的節點轉換,以下的案例能夠直觀的看到彼此之間的轉換原理。
XML是節點名與值,JSON也是KEY與VALUE的鍵值對。這樣的轉換是最簡單的。
XML:
<Student>張三</Student>
轉為JSON:
{ "Student": "張三" }
這個過程是可逆的,JSON可以很簡單轉為XML。
2) XML節點含有屬性
節點含有屬性,其轉換就不同了,在JSON中,XML屬性也作為了JSON對象的屬性,為了區別與其他的節點,這里節點名增加特殊的前綴標識"@"以標識是屬性,
另外一個比較奇怪的是,節點的值,增加屬性名,且有特殊前綴,“#text”。這樣的處理可以使得XML與JSON的轉換實現可逆操作。JSON中@開頭的,轉為XML時,需要生成節點屬性,#text則為節點的內容。這里的轉換是常用的轉換器的通用做法。
以下的轉換例子
XML:
<Student ID="1001">張三</Student>
轉為JSON
{ "Student": { "@ID": "1001", "#text": "張三" } }
3)有屬性的節點生成對象
例1,無屬性節點,簡單的字符串數組
<line> <item>name</item> <item>age</item> </line>
轉為JSON:
{
"line": {
"item": [
"name",
"age"
]
}
}
例2,有屬性的轉為對象,無屬性的則直接轉為字符串
有屬性節點
<line> <item font-size="20">name</item> <item>age</item> </line>
轉為JSON:
{
"line": {
"item": [
{
"@font-size": "20",
"#text": "name"
},
"age"
]
}
}
4) XML的節點順序性
XML存在着節點之間的順序,但當轉為JSON后,有時順序會被打亂。
這一點,可以解釋XML與JSON的一大不同,描述結構順序性,特別是復雜結構時,JSON沒有XML清晰簡單。
以下的例子,我們可以清晰看到這一點,轉換不可逆。
例子:
XML:
<template> <block>天空</block> <line>地平線</line> <block>地下</block> </template>
轉變為JSON:
{ "template": { "block": [ "天空", "地下" ], "line": "地平線" } }
在這里,我們可以看到在JSON中,將兩個block放到了一起,中間的line則放到了后面,XML原有的節點順序就此打亂。
如果想從此JSON轉為原來的XML,已經不可能。
如果非要較真,當然可以在JSON中指定具體的屬性,標識其順序或者前后節點之間的關系,但是這樣做,確實增加復雜度。
4、XML的屬性與元素對比
屬性無法包含多重的值(元素可以)
屬性無法描述樹結構(元素可以)
屬性不易擴展(為未來的變化)
屬性難以閱讀和維護
如下的XML感覺很愚蠢:
<message time="2014-10-01 10:10:02" to="Lucy" from="Jim" body="Don't forget the meeting!"></message>
應該為:
<message> <from>Jim</from> <to>Lucy</to> <time>2014-10-01 10:10:02</time> <body>Don't forget the meeting!</body> </message>
原則:
元數據(有關數據的數據)應當存儲為屬性,而數據本身應當存儲為元素。
5、建議選擇原則
1)對於復雜的數據結構使用XML,簡單的數據結構可采用JSON。
2)在互聯網應用中數據傳輸中,提倡使用JSON。
3)針對前后端的差異,可以在服務端使用XML,在前端使用JSON,兩者之間的轉換在服務器端完成。這樣可以各取所長。
