XML与JSON的对比

1、各自定义

  • XML
    扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
  • JSON
    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 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)。

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:
<pre><code> { "Student": "张三" }</code></pre>

这个过程是可逆的,JSON可以很简单转为XML。

    1. XML节点含有属性
      节点含有属性,其转换就不同了,在JSON中,XML属性也作为了JSON对象的属性,为了区别与其他的节点,这里节点名增加特殊的前缀标识"@"以标识是属性,
      另外一个比较奇怪的是,节点的值,增加属性名,且有特殊前缀,“#text”。这样的处理可以使得XML与JSON的转换实现可逆操作。JSON中@开头的,转为XML时,需要生成节点属性,#text则为节点的内容。这里的转换是常用的转换器的通用做法。
      以下的转换例子
      XML:
      <Student ID="1001">张三</Student>

转为JSON
<pre><code> { "Student": { "@ID": "1001", "#text": "张三" }}</code></pre>

  • 3)有属性的节点生成对象
    例1,无属性节点,简单的字符串数组

    <line> <item>name</item> <item>age</item></line>
    

转为JSON:
<pre><code>http://upload-images.jianshu.io/upload_images/1669146-01f7a52448a21bf9.gif?imageMogr2/auto-orient/strip
{ "line": { "item": [ "name", "age" ] }}
(http://upload-images.jianshu.io/upload_images/1669146-01f7a52448a21bf9.gif?imageMogr2/auto-orient/strip</code></pre>

例2,有属性的转为对象,无属性的则直接转为字符串
有属性节点
<pre><code><line> <item font-size="20">name</item> <item>age</item></line></code></pre>

转为JSON:
<pre><code>http://upload-images.jianshu.io/upload_images/1669146-01f7a52448a21bf9.gif?imageMogr2/auto-orient/strip
{ "line": { "item": [ { "@font-size": "20", "#text": "name" }, "age" ] }}
http://upload-images.jianshu.io/upload_images/1669146-01f7a52448a21bf9.gif?imageMogr2/auto-orient/strip
</code></pre>

    1. XML的节点顺序性
      XML存在着节点之间的顺序,但当转为JSON后,有时顺序会被打乱。
      这一点,可以解释XML与JSON的一大不同,描述结构顺序性,特别是复杂结构时,JSON没有XML清晰简单。
      以下的例子,我们可以清晰看到这一点,转换不可逆。
      例子:
      XML:
      <template> <block>天空</block> <line>地平线</line> <block>地下</block> </template>

转变为JSON:
<pre><code>http://upload-images.jianshu.io/upload_images/1669146-01f7a52448a21bf9.gif?imageMogr2/auto-orient/strip
{ "template": { "block": [ "天空", "地下" ], "line": "地平线" }}
http://upload-images.jianshu.io/upload_images/1669146-01f7a52448a21bf9.gif?imageMogr2/auto-orient/strip</code></pre>

在这里,我们可以看到在JSON中,将两个block放到了一起,中间的line则放到了后面,XML原有的节点顺序就此打乱。
如果想从此JSON转为原来的XML,已经不可能。
如果非要较真,当然可以在JSON中指定具体的属性,标识其顺序或者前后节点之间的关系,但是这样做,确实增加复杂度。

4、XML的属性与元素对比
属性无法包含多重的值(元素可以)属性无法描述树结构(元素可以)属性不易扩展(为未来的变化)属性难以阅读和维护
如下的XML感觉很愚蠢:
<pre><code><message time="2014-10-01 10:10:02" to="Lucy" from="Jim" body="Don't forget the meeting!"></message></code></pre>

应该为:
<pre><code><message> <from>Jim</from> <to>Lucy</to> <time>2014-10-01 10:10:02</time> <body>Don't forget the meeting!</body> </message></code></pre>

原则:
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

  • 5、建议选择原则
    1)对于复杂的数据结构使用XML,简单的数据结构可采用JSON。
    2)在互联网应用中数据传输中,提倡使用JSON。
    3)针对前后端的差异,可以在服务端使用XML,在前端使用JSON,两者之间的转换在服务器端完成。这样可以各取所长。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容