JSON

XML和JSON 热门技术

字号+ 作者:H5之家 来源:H5之家 2017-08-31 18:03 我要评论( )

不久前看到一个讨论帖,说的是XML和JSON的比较,说着说着后来就变成了JSON到底比XML牛逼在哪里。不吹不黑,客观地来比较一下二者的异同。 XML比JSON更胖吗? 有

你的位置:热门技术 > JSON > XML和JSON

XML和JSON

JSON admin 3年前 (2015-02-21) 997浏览


不久前看到一个讨论帖,说的是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=""> <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; } }

对于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> ]>

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>

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • MySQL 5.7 新增加的 JSON 特性对应的 json 方法

    MySQL 5.7 新增加的 JSON 特性对应的 json 方法

    2017-09-01 09:03

  • Newtonsoft.Json(Json.net)的基本用法 JsonConvert.SerializeO

    Newtonsoft.Json(Json.net)的基本用法 JsonConvert.SerializeO

    2017-09-01 09:03

  • xml转化为json,多谢

    xml转化为json,多谢

    2017-08-31 16:02

  • ASP 处理JSON数据的实现代码

    ASP 处理JSON数据的实现代码

    2017-08-31 11:04

网友点评
-