XML和JSON

jopen 9年前發布 | 16K 次閱讀 JSON JSON開發包

XML和JSON 不久前看到一個討論帖,說的是XML和JSON的比較,說著說著后來就變成了JSON到底比XML牛逼在哪里。不吹不黑,客觀地來比較一下二者的異同。

XML比JSON更胖嗎?

有的情況下是的,但也不一定,比較這樣的片段:

<user age="18">
    <address>
        <city name="Seattle" />
    </address>
</user>

{"user" : {
    "age" : 18,
    "address" : {
        city : {
            name : "Seattle"
        }
    }
}}

二者信息量幾乎均等,XML看起來并不顯得多么冗余。有恰當的編輯器,二者都可以有比較美觀的縮進表達。

當然,也有很多情況我們可以看到XML要比JSON啰嗦(有人說JSON是fat-free alternative to XML),比如XML寫這樣的東西:

<employees>
    <employee>
        <address value="..."/>
    </employee>
    <employee>
        <address value="..."/>
    </employee>
    <employee>
        <address value="..."/>
    </employee>
<employees>

如果employees和employee這節點名字名字本身不重要的話,寫成JSON就簡單多了:

[{address:"..."}, {address:"..."}, {address:"..."}]

JSON的表達直觀在哪里?

繼續就著上面的例子看:

XML格式下,我無法得知age其實是一個數字,因為XML里面你無法進一步區分簡單數據類型;但是JSON就不是了,18是數字,”18″是字符串;true是布爾真,”true”是字符串;null是空,”null”是字符串。

如果要表達數組呢?XML中可以在父節點下面累放節點,而JSON則有[ ]這樣更直觀的方式。

如果字符串中有換行符怎么辦,JSON不存在這個問題,而XML必須引入CDATA解決問題,比如:

<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
  {
  return 1;
  }
else
  {
  return 0;
  }
}
]]>
</script>

XML也有優勢

比如XML可以有聲明(declaration):

<?xml version='1.0' encoding='character encoding' standalone='yes|no'?>

規定了編碼格式等等信息,但是JSON就沒有這樣的東西。

當上面的standalone為yes的時候表示DTD直接寫到這個XML里面去,這樣,就不需要額外的DTD文件了,也就是說,這個文件不但是自解釋,還是自校驗的了。而這一點,JSON是不可能做到的。

另外,XML還可以有命名空間,可以通過xmlns屬性引入不同的定義文件,像編程語言的import來自由組合,這一點,JSON也是做不到的:

<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>

另外,在偶然出現格式錯誤的時候,由于起始和結束標簽對應的關系,XML的校驗會比JSON更容易發現“錯在哪里”,換言之,修復的可能性更大。

和對象之間的互相轉化

JSON的一大好處是有些語言可以原生支持,比如JavaScript,不需要一個JSON Parser這樣的東西,代碼里表示對象用的就是JSON格式的表達。但是直接支持XML的編程語言,好像沒有吧,倒是有像HTML等等標記語言的解析器,可以處理任意DOM對象。

如果要把JSON轉成對象,在支持JSON對象的瀏覽器中可以寫:

var obj = JSON.parse(text);

如果不支持,則可以這樣做:

var obj = eval ("(" + text + ")");

如果是反過來,要把對象表達成JSON表達式呢?

JSON.stringify(obj);

這些都是原生的支持,如果是XML,要和對象之間互相轉換,則要麻煩得多,需要借助第三方類庫。支持注解的表達會讓代碼清晰很多,把XML這種聲明式的表達,變成另一種類定義聲明式的表達,比如這個例子

<StepList>
  <Step>
    <Name>Name1</Name>
    <Desc>Desc1</Desc>
  </Step>
  <Step>
    <Name>Name2</Name>
    <Desc>Desc2</Desc>
  </Step>
</StepList>

帶有注解的類定義聲明式表達:

[XmlRoot("StepList")]
public class StepList
{
    [XmlElement("Step")]
    public List<Step> Steps { get; set; }
}

public class Step { [XmlElement("Name")] public string Name { get; set; } [XmlElement("Desc")] public string Desc { get; set; } }</pre>

對于XML和JSON之間的互相轉化,除了類庫,還有一些在線的工具,用起來很方便,比如這個

XML DTD和JSON Schema

DTD指的是Document Type Definition,用于定義XML文件的節點屬性格式和含義,比如這樣的DTD文件

<!DOCTYPE NEWSPAPER [

<!ELEMENT NEWSPAPER (ARTICLE+)> <!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)> <!ELEMENT HEADLINE (#PCDATA)> <!ELEMENT BYLINE (#PCDATA)> <!ELEMENT LEAD (#PCDATA)> <!ELEMENT BODY (#PCDATA)> <!ELEMENT NOTES (#PCDATA)>

<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED> <!ATTLIST ARTICLE EDITOR CDATA #IMPLIED> <!ATTLIST ARTICLE DATE CDATA #IMPLIED> <!ATTLIST ARTICLE EDITION CDATA #IMPLIED>

]></pre>

XML除了DTD本身,還有一個真正的schema,叫做XML Schema,它本身也是XML。其實,XML Schema是針對DTD無法解決問題而發明的進化版本,可以定義數據類型,包括集合類型,可以指定順序,元素出現次數,支持命名空間,以及定義缺省值等等。另外,哪怕就從這一點上看,XML的功能性上確實要比JSON更強大:

<?xml version="1.0"?>
<xs:schema xmlns:xs=";

<xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>

</xs:schema></pre>

相應地,JSON也有類似的東西,叫做JSON Schema,它本身也是JSON。比如這個例子:

{
    "title": "Example Schema",
    "type": "object",
    "properties": {
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        },
        "age": {
            "description": "Age in years",
            "type": "integer",
            "minimum": 0
        }
    },
    "required": ["firstName", "lastName"]
}

從XPath到JSONPath

我們經常需要一種表達式來訪問整個XML中間的某個節點或者屬性,XPath就是這樣的表達式,比如下面這個XPath表達式就是XPath維基百科頁上面XPath標題的節點

//*[@id="firstHeading"]/span

為什么很少提及JSON數據的path?主要原因是因為一旦有了語言原生支持,我們就不自覺地使用了,比如JavaScript中使用對象的某一個屬性一樣自然。但是,無論如何,一個path的表達式還是不可替代的,除了各色的開源項目,還有一個叫做JSON Pointer的規范,雖然沒能得到足夠多的贊成票;也有人擬了一個JSONPath的東西,這個看起來就完備得多了:

XML和JSON

還有其它的替代品嗎?

有。比如YAML,表意更加豐富,還省掉了很多格式化的符號,比如JSON的引號和XML的標簽記號。YAML官網的介紹,記錄了它和JSON以及XML之間的比較:

JSON’s foremost design goal is simplicity and universality. In contrast, YAML’s foremost design goals are human readability and support for serializing arbitrary native data structures. Thus, YAML allows for extremely readable files, but is more complex to generate and parse.

YAML is primarily a data serialization language. XML was designed to support structured documentation. XML therefore had many design constraints placed on it that YAML does not share.

</blockquote>

看看下面的例子,不得不說,就清晰簡潔為上的可讀性上而言,YAML是三者中最好的:

---
receipt:     Oz-Ware Purchase Invoice
date:        2007-08-06
customer:
    given:   Dorothy
    family:  Gale

items:

- part_no:   A4786
  descrip:   Water Bucket (Filled)
  price:     1.47
  quantity:  4

- part_no:   E1628
  descrip:   High Heeled "Ruby" Slippers 
  price:     100.27
  quantity:  1

bill-to: &id001 street: | 123 Tornado Alley Suite 16 city: East Westville state: KS

ship-to: *id001

specialDelivery: > Follow the Yellow Brick Road to the Emerald City. Pay no attention to the man behind the curtain. ...</pre>

來源鏈接《四火的嘮叨》

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!