為什麼都反對 XML 而支持使用 JSON?
我只提一個使用上的因素:JSON的結構更容易映射至一般語言的數據結構。
XML和JSON的主要組成成分:- XML是element、attribute和element content。
- JSON是object、array、string、number、boolean(true/false)和null。
XML要表示一個object (指name-value pair的集合),最初可能會使用element作為object,每個key-value pair 用 attribute 表示:
&
Guang Dong&
&&
&
&
&
&
...
&
&
那麼,什麼時候用element,什麼時候用attribute,就已經是一個問題了。[1] 提到一些優缺點。
而JSON因為有object這種類型,可以自然地映射,不需考慮上述的問題,自然地得到以下的格式。{
"name": "John",
"age" : 10,
"address" : {
"country" : "China",
"province" : "Guang Dong",
"city" : "..",
"district" : "..",
...
}
}
- XML需要選擇怎麼處理element content的換行,而JSON string則不須作這個選擇。
- XML只有文字,沒有預設的數字格式,而JSON則有明確的number格式,這樣在locale上也安全。
- XML映射數組沒大問題,就是數組元素tag比較重複冗餘。JSON 比較易讀。
- JSON的true/false/null也能容易統一至一般編程語言的對應語義。
最後,大家可關注我的C++開源JSON項目 miloyip/rapidjson · GitHub 。
[1] ASC X12 REFERENCE MODEL FOR XML DESIGN §7.2.5 http://www.x12.org/x12org/comments/X12Reference_Model_For_XML_Design.pdf
我覺得答案中已經有非常多的例子說明 JSON 比 XML 具有優勢的地方. 我來說一個使用場景是我覺得 XML 比 JSON 有優勢的情況 --- UI 數據的描述.
我們都知道 JSON 和 XML 設計的初衷里都包含一點是對人類友好, 所以兩者在這方面屬於競爭關係. 而在 UI 描述上, 我覺得 XML 是比 JSON 要優異很多. 我們先來看一組簡單的數據排版:
&
&
&
&
&
&
&
倘若由 JSON 描述, 將會變成:
{
"type": "ui:group",
"layout": "vertical",
"children": [
{
"type": "ui:block",
"width": 200,
"layout": "horizontal",
"children": [
{ "type": "ui:input", "value": "search" },
{ "type": "ui:button", "label": "Search" },
]
},
{
"type": "ui:block",
"width": 400,
},
],
}
可以看出來, XML 的數據會比 JSON 更符合人類對 UI 布局的描述, JSON 在這個場景中會更加偏向對機器友好.
然而情況還不僅僅是這樣, 我們回過頭來看看上面數據中的 ui:button 定義. XML 中的定義, 我採用了 `&
&
&
OK
&
而在 JSON 中, 嵌套結構將會帶來無盡的 Array + Object 的組合, 對人類閱讀並不十分友好.
所以, 並不是所有情況都要反對 XML 而去使用 JSON, 我覺得只有在數據需要和代碼實例做映射時, JSON 相對 XML 的優勢才能體現. 而其他一些使用場景, XML 也好, JSON 也好, 都有各自發揮的地方.
原來必須大炮打蚊子的地方,人們發現蒼蠅拍更順手了而已。就像 Python 代替 C++ 和 Java 做了不少網路伺服器一樣道理。不是每個代碼都為了流芳百年,DTD / XSD 還沒寫好的時候我 JSON API 已經調試完成了。
給一個最簡單的例子吧。In [1]: from json import dumps
In [2]: d = {"name": "vczh", "rate": "UINT_MAX", "comments": ["vczh is the god", "php is the god too"]}
In [3]: print(dumps(d, indent=4))
{
"rate": "UINT_MAX",
"name": "vczh",
"comments": [
"vczh is the god",
"php is the god too"
]
}
用內置類型做建模,無縫轉化成 JSON 格式,看起來甚至都不陌生(上例中甚至語法上完全兼容),傳統重型工具(如 XML,如 Java / C++)是做不到的。
用 Python 內置 dict / string 類型與 C++ 的 std::string, std::hash_map 進行類比,JSON 在表達 半結構化數據的時候,因為內置幾種基本類型,雖然存在靈活性 受到限制的可能性(也僅僅是可能性而已),但方便程度要大大提高。更多的論述請參考 @Milo Yip 前輩的答案 發佈於 11:18。@vczh 在評論中提到,XML 可以非常方便的映射到 C# 類型中去; @沈萬馬 也提到 XML 包含各種冗餘信息。其實這兩點之間是相互促進的。
JSON 的設計基於幾種非常簡單的基礎類型(http://json.org 首頁 5 張圖就概括完了整個語法),其實更適用於基於字典的動態類型甚至 prototype-based 語言;這與 JSON 源自於 JavaScript 也是分不開的。這種和動態語言內置類型無縫轉化的能力,搭配各種優秀的 REPL(Clojure REPL, iPython Notebook, etc。前面的代碼就是 iPython 交互過程),真正體現了所謂「探索性編程」(exploratory programming)的強大能力。關於探索性編程的更多探討請參考 Paul Graham 的 "Hackers Painter" 選段,具體位置想不起我就不引述了。
p.s. 在有了已成 RFC 6901 [1] 的 JSON Pointer 和有大量實現的 JSON-schema [2] 之後,用 XML 的理由更少了。
[1] RFC 6901 - JavaScript Object Notation (JSON) Pointer[2] JSON Schema Software
更多知名的 JSON 生態環境重量級工具:
XML 一心想做而沒做到的文檔資料庫:MongoDBApache CouchDB直接 in-JSON-for-JSON 的搜索引擎:Open Source Distributed Real Time Search Analytics更多不知名的工具選擇:
jq - like sed for JSONXSLT equivalent for JSON: XSLT equivalent for JSONjoelvh/json2json · GitHub==== 下面是口號時間 ====
Ad-hocy is the new sexy.PHP 是最好的語言!在我長時間使用XML和JSON的過程中我發現,其實他們是不可互相替代的。我們只能說如今大部分適合XML的程序要麼都寫完了要麼都不時髦了,現在需要JSON的還沒寫的程序多一點。
XML相比JSON最大的區別是充滿了冗餘信息。多數時候我們不需要冗餘信息,但是一旦需要的時候沒有就是不行。這就是XML與JSON最大的區別。為什麼很多人反對使用XML,因為多數時候不需要冗餘信息。
誰說的?
信息技術的世界除了編程的還有其他人群!
信息技術的世界除了編程的還有其他人群!信息技術的世界除了編程的還有其他人群!
json還是js的衍生物,而xml是tag組成的,有相當多的語言都是採用的標籤
還記得&嗎?網頁人員不用懂編程,也會寫html可以自定義一個標籤系統並發布它
標籤可以自定義每個標籤的行為也可以自定義另外,tag可以表達動作(指令),而不僅僅用來表達數據
&大部分,xml和json的表達能力是相當的
但不要忽略形式上語義表達能力此外XML還擁有XMLS、namespace等特性
XMLS用來實現XML的schema描述和校驗namespace允許你書寫出&你現在可以只關注性能,但千萬不要忽視描述能力這些軟的層面的東西
就像,我們已經有了MongoDB的js查詢語法,已經有了hadoop的mapreduce編程介面,但人們總是想方設法的封裝出SQL語言介面一樣json的存在是典型的20%功能解決80%需求。為什麼不要xml?因為裡面80%的功能你不需要,等你需要的時候你就明白,這事只能xml干,json不行。
而且,就算是承載同樣的結果,xml 的數據量也會比 json 更大一些些吧,因為有很多冗餘的&
XML文檔可以附上DTD、Schema,還有一堆的諸如XPath之類規範,使用自定義XML元素或屬性,能很方便地給數據附加各種約束條件和關聯額外信息,從數據表達能力上看,XML強於Json,但是很多場景並不需要這麼複雜的重量級的東西,輕便靈活的Json就顯得很受歡迎了。打個比方,如果完成某件事有兩種方式:一種簡單的,一個複雜的。你選哪個?我只想殺只雞罷了,用得著牛刀?Json與XML相比就是這樣的。
因為原來xml的各家便利查詢等的api實在太繁瑣了,json使用時則簡潔很多
你們這些不用 S-EXP 的都是異端!
主要還是因為json在js上的使用最方便,後來開始影響到服務端
json列印出來之後好讀。而xml需要專門的工具來幫助閱讀。json的庫好像都比xml的庫好用很多,iOS官方的標準庫裡面json能夠直接映射到NSArray或者NSDictionary,而xml不行。
JSON 比XML看著順眼
1.象第一位說的,什麼時候用element,什麼時候用attribute,這個是非常糾結的,2.同樣的東西,xml設計出來的,相差很大3.xml最重要的schema和DTD,這些定義非常麻煩,一般都不定義,這樣沒了xml的最大優點了4.不知道怎麼回事 xml解析器非常難用,dom,sax都非常難用。。。
5.冗餘不提也罷
就是不喜歡尖括弧!
過一段時間就會有 為什麼都反對json而支持使用protobuf呢?之類的問題。
以前程序員兼職網管兼職資料庫,現在公司有了專業運維和專業DBA後,就不需要程序員了么?
不過是職能細化以後有了更合適的工具來幹了罷了。xml能專心干自己該做的事情。
現在xml還不至於完全被替代,何來反對之說。在數據傳輸的應用下,我會更傾向json,但在人機都需要識別數據的時候,比如配置文件,我還是傾向xml,xml的可讀性比json好。正如輪子哥說的,這兩者不是互相替代
如果是用在遊戲這種不追求系統互通共享數據的地方,protobuf的文本格式比json來的更為簡單,右值連雙引號都不需要,項分割也無需逗號,寫好idl生成代碼運行後,數據直接可取,無需手動解析。擔心性能還可以二進位序列化,傳輸包大小問題也解決了
當你的客戶端隊友通知你,用戶投訴流量太多了,必須降低流量,你一看你的xml,再看看別人家的json,保准你妥妥地叛變了
推薦閱讀: