请停止比较JSON和XML

Posted 小象

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请停止比较JSON和XML相关的知识,希望对你有一定的参考价值。

原文链接:http://www.yegor256.com/2015/11/16/json-vs-xml.html

翻译:林炀,校审:王苇棋


JSON和XML哪个更好?哪个更快?在我的下一个项目中应该选择哪一个?请停止比较JSON和XML吧,这些东西没有可比性。这就类似于比较一量自行车和奔驰AMG S65。说真的,哪一个更好的?他们都可以把你从家带到办公室里不是吗?在某些情况下,自行车甚至可以更好的做到这一点。但这是否意味着它们可以相互比较?使用JSON和XML也是同样的,他们在自己的领域适用性上是两种截然不同的东西。


下面是一个简单的JSON片段(140字符):


{
"id":123,
"title":"Object Thinking",
"author":"David West",
"published":{
"by":"Microsoft Press",
"year":2004
}
}
 

在XML中,上述同样信息的文档如下(167字符):

<?xmlversion="1.0"?>
<bookid="123">
<title>ObjectThinking</title>
<author>DavidWest</author>
<published>
<by>MicrosoftPress</by>
<year>2004</year>
</published>
</book>


JSON是一种很好的数据格式,但他也只是一种数据格式

这样放在一起就很好比较了不是吗?第一个例子有点短,它更容易理解,因为它看起来并没那么“神秘”,同时可以完美的在javascript中解析。这样一看我们自然就会优先使用JSON,谁会愿意首先去选择已经诞生15年的看似笨重的XML呢?


好吧,其实我还是需要他的,并且我很喜爱XML,让我解释一下理由。


不要误会我的意思,这不代表我反对JSON。JSON是一个很好的数据格式,但它只是一种数据格式。我们使用它来临时的让一段数据从A点转移到B点。事实上,它也只是比XML更短而已。


XML不是一种数据格式,它是一种非常强大的语言,让我来告诉你它能用来做什么。我基本上解释了为什么我喜欢它,并且我强烈建议你阅读一下Elliotte Rusty Harold和W. Scott Means所著的XML in a Nutshell(第三版)。


我认为XML有四个特点可以让它和JSON或其它简单的数据格式如YAML之间严格的区分开来。


XPath。

为了得到上面例子文件中出版物的年份信息,只需要发送一条XPath查询:


/book/published/year/text()不管怎样,在这里必须要有一个XPath处理器能够理解我的请求并且返回值2004。庆幸的是,在XPath 2.0中已经有功能非常强大的查询引擎,它包含有自己的函数、谓词、轴等等。你可以从字面上使用任何逻辑来发送XPath请求,而不需要在Java中编写任何跨越逻辑。比如说,你可能会想知道“David West在2004年出版了多少本书?”,这时候只需要通过XPath就可以了,JSON这时候就做不到这点。


属性和命名空间

你可以将元数据附加到你的数据里,就像刚才上面例子中的id 属性。数据在元素里面,就像这本书作者的名字,元数据(关于数据的数据)可以并且应该被放入属性。这对组织和结构化信息有显著的帮助。最重要的是,这两种元素和属性可以被标记并从属于特定的命名空间。当几个应用程序正在共同使用相同的XML文档时,这会种技术会发挥很大的作用。


XML模式

当你在一个地方创建了一个XML文件,而在其它地方你对这个文件进行了几次修改,并将它传输到了另一个地方,你希望确保它的结构不会被这些操作给打破。其中一人可能会用<year>存储出版时间,而另外一人可能会用<date>去符合ISO-8601。为了避免结构混乱,因此创建了一个补充文件,并将它与主文档放在一起,这就是所谓的XML模式。而在主文档使用时将会用所提供的模式来验证它的正确性,这是一种在生产中的集成测试。RelaxNG也是类似的,但是在原理上更简单,如果你觉得XML模式过于复杂的话,也许你可以试一试RelaxNG。


XSL

你可以修改你的XML文件并且完全不需要任何Java、Ruby等等的代码,只需要创建一个XSL转换文件并且将它“应用”到你的原始XML中,作为结果你将会得到一个新的XML,这种XSL语言(顺便说一下,这种语言纯粹是功能性的)是专为分层的数据操作设计的,它比Java或者任何OOP程序方法都更适合这类任务。你可以将XML文档转换成任何东西,包括纯文本和HTML。有些人抱怨XSL的复杂性,但是请先尝试着用一段时间。它的核心功能是相当直接的,你不会需要它的所有的功能。


上面所说的还并不完整,还有许多其它的语言,但是这四个功能对我来说是非常有意义的。他们让我的文件有能力“自给自足”。它可以验证自己(XML模式),它知道如何修改自身(XSL),它让我能很方便的访问内部的任何东西(Xpath)。


还有很多其他围绕着XML的语言、标准、应用开发,例如Xforms、SVG、MathML、RDF、OWL、WSDL等等。但你不大可能在一个主流的项目中用到它们,因为它们都比较“小众”。现在有一些功能,诸如JSONPath的查询,一些转换的工具,还有对json-schema进行验证等等,事实上JSON并不是特意为了这些功能而设计的,但是这些功能已经开始在JSON的世界中找到了自己的位置。但他们目前相比于XML都还是微不足道的,并且我认为他们未来不会有什么很大的改进。或者让我换种说法:我认为他们在未来迟早都会消失,他们只是把一个不错又简单的格式变得更笨拙。


因此,总结一下,JSON是一个简单的数据格式,并没有额外的功能。它的最佳使用案例是AJAX。在其他情况下,我强烈建议你使用XML。相关贴子:


会对下面的贴子有兴趣:

XML Data and XSL

Views in Takes FrameworkJAXB Is Doing It

Wrong; Try XemblyXSL Transformation

in Java: An Easy WayRESTful API and a

Web Site in the Same URLXML/XPath Matchers

for Hamcrest


大家可以自己搜着看一下哦~



以上是关于请停止比较JSON和XML的主要内容,如果未能解决你的问题,请参考以下文章

XML与JSON两种数据结构比较和各自底层实现

如何从片段中的 JSON 响应中的对象获取数据

使用 navhost 在底部导航中停止片段刷新

如何在 Mac / iOS 上制作 cordova 以停止在 config.xml 和 package.json 的插件版本号中添加插入符号 (^)

ListFragment 的上下文菜单

VS Code配置markdown代码片段