JSON还是XML?哪一个比较好?哪一个更快?我下一个项目应该使用哪一个?
这些东西没有可比性。说真的,就像比较自行车和出租车一样。他们都可以把你从家里带到办公室,对吧?在某些情况下,自行车会做得更好。但这是否意味着他们可以互相比较呢?这里同样适用于JSON和XML。它们与自己的适用范围是非常不同的.
下面是一个简单的JSON数据块的样子(140个字符):
{ "id": 123, "title": "Object Thinking", "author": "David West", "published": { "by": "Microsoft Press", "year": 2004 } }
类似的文档在XML中是这样的(167个字符):
<?xml version="1.0"?>
<book id="123">
<title>Object Thinking</title>
<author>David West</author>
<published>
<by>Microsoft Press</by>
<year>2004</year>
</published>
</book>
看起来很容易比较对吧,JSON要短一些,并且更容易理解,在js中能够完全解析出来。但我却更偏爱XML.
XML不是一种数据格式,而是一种语言,非常强力的一种。下面我将从几个方面来解释我为何这么说:
一,XPath。要想从上述文件单独获取到发行年份,我只是查询XPath:/book/published/year/text()。但是,必须有一个XPath处理器来理解我的请求并返回2004。XPath 2是一个非常强大的查询引擎功能,等你可以把任何逻辑引入XPath请求而无需编写任何遍历逻辑在java中,例如。你可能会问:“大卫·韦斯特在2004出版了多少本书?”很容易通过XPath获得答案。JSON却不行
二,属性和名称空间。您可以将元数据附加到数据中,就像上面使用id属性所做的那样。例如,数据保存在元素中,就像书作者的名字一样,元数据(关于数据的数据)可以并且应该放在属性中。这有助于组织和构造信息。最重要的是,这两个元素和属性都可以标记为属于某些确定的名称空间。在一些应用程序使用同一个XML文档,这是一个非常有用的技术。
三,XML Schema。当你在一个地方创建一个XML文档时,在其他地方修改几次,然后把它转移到另一个地方,你要确保它的结构不会被任何一个动作破坏。其中一个可以使用<year>存储出版日期而另一个使用<date>和ISO-8601。为了避免结构上的混乱,创建一个补充文档,称为XML模式,并将其与主文档一起传送。每个想使用主文档的人都将首先使用提供的模式来验证其正确性。这是一种在生产中的集成测试。RelaxNG是类似的更简单的机制,如果你试过以后,会发现XML架构太复杂。
四,XSL。你可以把你的XML文档的修改没有任何类似java/ruby代码。只需创建一个XSL转换文档并将其应用于您的原始XML。作为输出,您将获得一个新的XML。顺便说一下,XSL语言(它完全是功能性的)是为分层数据操作而设计的。它是比java或OOP/程序更适合这项任务的方法。您可以将XML文档转换为任何内容,包括纯文本和HTML。有些人抱怨XSL的复杂性,但请试一下。你不需要所有的,它的核心功能是非常直接的。
以上这些并不是一个完整的列表,但这四个特性在我看来真的很重要。它们使我的文档具有“自给自足”的能力,它可以验证自己(XML模式),它知道如何修改自身(XSL),它使我获取内部的任何东西都非常方便(XPath)。
还有更多的语言,标准,和开发应用程序,XML,包括XForms,SVG,MathML,RDF,OWL,WSDL等等。但你是不太可能在一个主流的项目使用他们。
JSON没有这样的特点,即使一些开发者们正在试图在JSON添加这些特性,包括jsonpath查询、转换工具,JSON模式验证等。但相比XML提供的,他们只是弱弱的模仿,我不认为他们有任何的未来。或者让我们这样说:我希望他们迟早会消失。他们只是把一个好的简单的格式变成笨拙的东西。
因此,可以得出结论,JSON是一种简单的数据格式,没有额外的功能。它的最佳用例是ajax。在所有其他情况下,我强烈建议使用xml。