我正在创建一个复杂的JavaScript库,用于处理我公司的服务器端框架。
服务器端框架将其数据编码为简单的XML格式。没有花哨的名字空间或类似的东西。
理想情况下,我想将浏览器中的所有数据解析为JSON。但是,如果我这样做,我需要重写一些服务器端代码以吐出JSON。这很痛苦,因为我们有公共API,我无法轻易改变。
我真正关心的是在解析JSON与XML的浏览器中的性能。关注真的有很大的不同吗?或者我应该专门去寻找JSON?有没有人对两者之间的性能差异有任何经验或基准?
我意识到大多数现代Web开发人员可能会选择JSON,我可以理解为什么。但是,我真的只对表现感兴趣。如果已经证明存在巨大差异,那么我准备花费额外的精力为客户端生成JSON服务器端。
答案 0 :(得分:29)
<script type="text/javascript">
var data = <?php json_encode($data)?>;
</script>
有关详细信息,请参阅此处:
Why is Everyone Choosing JSON Over XML for jQuery?
另外......你真正需要在“生成”JSON中加入什么“额外的努力”?当然你不能说你将手动构建JSON字符串?几乎每种现代服务器端语言都有将原始变量转换为JSON字符串的库。例如,PHP的核心json_encode
函数转换了一个关联数组,如下所示:
$data = array('test'=>'val', 'foo'=>'bar');
到
{"test": "val", "foo": "bar"}
这只是一个JavaScript对象(因为JS中没有关联数组(严格来说))。
答案 1 :(得分:19)
首先,我要感谢所有回答我问题的人。我真的很感谢你的所有回复。
关于这个问题,我通过运行一些基准进行了一些进一步的研究。解析发生在浏览器中。 IE 8是唯一没有本机JSON解析器的浏览器。 XML与JSON版本的数据相同。
Chrome(版本8.0.552.224),JSON:92毫秒,XML:90毫秒
Firefox(版本3.6.13),JSON:65ms,XML:129ms
IE(版本8.0.6001.18702),JSON:172ms,XML:125ms
有趣的是,Chrome似乎速度几乎相同。请注意,这是解析大量数据。由于数据片段不多,这可能不是什么大问题。
答案 2 :(得分:8)
已完成基准测试。 Here's one。一些早期浏览器的差异似乎是整个数量级(大约10毫秒而不是100毫秒),但不是很大。部分原因在于服务器响应时间 - XML作为数据格式更为庞大。部分原因是解析时间--JSON允许您发送JavaScript对象,而XML需要解析文档。
除非您不想公开JSON,否则您可以考虑向公共API添加一个返回JSON的方法,而不是修改现有函数,除非您不想公开JSON。
答案 3 :(得分:4)
假设您不是在谈论千兆字节的XML,那么性能并不是真正的考虑因素。是的,它需要更长的时间(XML更冗长),但它不会是用户会注意到的东西。
在我看来,真正的问题是在JavaScript中支持XML。 E4X很好,但微软不支持。因此,您需要使用第三方库(例如JQuery)来解析XML。
答案 4 :(得分:2)
如果可能的话,只测量一下是有意义的。 “如果可能的话”,我的意思是javascript的工具(特别是性能分析)可能不如独立编程语言那么好。
为什么要衡量?因为仅基于数据格式属性的推测对于性能分析并不是非常有用 - 开发人员的直觉在预测性能方面非常糟糕。在这种情况下,它只意味着所有使用中的相应XML和JSON解析器(和生成器)的成熟度。 XML具有更长时间的优点; JSON处理起来有点简单。这基于实际编写的库用于处理两者。最后,如果所有事情都相同(库的成熟度和性能优化),JSON确实可以更快地处理。但两者都可以非常快;或者实施不当很慢。
但是:我怀疑你不应该像许多人已经建议的那样担心性能问题。 xml和json都可以有效地解析,并且可以使用现代浏览器。 如果您遇到性能问题,则可能不是读取或写入数据而是其他内容;第一步实际上是弄清楚实际问题是什么。
答案 5 :(得分:1)
由于JSON是原生的并且是为Javascript设计的,因此它将整天执行XML解析。你没有提到你的服务器端语言,在PHP中有PHP核心内置的json_encode / json_decode功能......
答案 6 :(得分:1)
性能的差异会非常小,你甚至都不会注意到它(并且:在你出现性能问题之前,你不应该考虑性能问题 - 有一个需要注意的许多重要事项 - 可维护,可读和记录的代码......)。
但是,回答你的问题:解析JSON会更快(因为它是简单的javascript对象表示法)。
答案 7 :(得分:1)
在这种情况下,我会说坚持使用XML。所有主流浏览器都有一个DOM解析接口,可以解析格式良好的XML。此链接显示了在Webkit / Opera / Firefox中使用DOMParser
接口以及在IE中使用ActiveX DOM对象的方法:https://sites.google.com/a/van-steenbeek.net/archive/explorer_domparser_parsefromstring
答案 8 :(得分:1)
它还取决于您的JSON结构。树状结构倾向于比对象列表更有效地解析。这是对数据结构的基本理解将会很方便的地方。如果您在JSON中解析类似于列表的结构,我可能不会感到惊讶:
{
{
"name": "New York",
"country":"USA",
"lon": -73.948753,
"lat": 40.712784
},
{
"name": "Chicago",
"country":"USA",
"lon": -23.948753,
"lat": 20.712784
},
{
"name": "London",
"country":"UK",
"lon": -13.948753,
"lat": 10.712784
}
}
然后将它与XML中的树状结构进行比较,可能如下所示:
<cities>
<country name="USA">
<city name="New York">
<long>-73.948753</long>
<lat>40.712784</lat>
</city>
<city name="Chicago">
<long>-23.948753</long>
<lat>20.712784</lat>
</city>
</country>
<country name="UK">
<city name="London">
<long>-13.948753</long>
<lat>10.712784</lat>
</city>
</country>
</cities>
XML结构可能比JSON产生更快的时间,因为如果我遍历英国的节点找到伦敦,我不必循环通过其他国家来寻找我的城市。在JSON示例中,如果伦敦位于列表底部附近,我可能会这么做。但是,我们在这里有一个结构上的差异。我会惊讶地发现XML在任何一种情况下或在结构完全相同的情况下都更快。
Here是我使用Python进行的一项实验 - 我知道问题是从JavaScript的角度严格审视这个问题,但您可能会发现它很有用。结果表明JSON比XML快。但是,重点是:你的结构如何影响你能够有效地检索它。
答案 9 :(得分:0)
解析或构造json比xml相对容易,并且大多数语言提供了更容易编码和解码json的方法,这对于xml来说有些复杂。
答案 10 :(得分:0)
坚持使用XML的另一个原因是,如果切换到JSON,则需要修改“维护合同”。在某种意义上说,XML比JSON更自然地工作于类型化语言(即非javascript)。
如果您更改为JSON,则代码库的某些将来的维护者可能会在某个时候引入JSON数组,该数组具有混合类型内容(例如[ "Hello", 42, false ]
),这将对以类型输入的任何代码带来问题语言。
是的,在XML中也可以做到这一点,但需要额外的精力,而在JSON中,它可以轻松插入。
虽然乍看之下似乎没什么大不了,但实际上是因为它迫使类型化语言中的代码坚持使用JSON树,而不是反序列化为本机类型。
答案 11 :(得分:-1)