【发布时间】:2011-07-18 02:12:05
【问题描述】:
我正在开发一个平面规划器 Flex 迷你应用程序。我只是想知道从 PHP 生成响应时,就性能而言,JSON 还是 XML 是更好的选择。我目前倾向于 JSON,因为响应也可以用于 Javascript。我在其他地方读到 JSON 比 XML 需要更长的时间来解析,这是真的吗?在 Flex 中使用 XML 与 JSON 处理数据的灵活性如何?
【问题讨论】:
标签: php xml apache-flex json
我正在开发一个平面规划器 Flex 迷你应用程序。我只是想知道从 PHP 生成响应时,就性能而言,JSON 还是 XML 是更好的选择。我目前倾向于 JSON,因为响应也可以用于 Javascript。我在其他地方读到 JSON 比 XML 需要更长的时间来解析,这是真的吗?在 Flex 中使用 XML 与 JSON 处理数据的灵活性如何?
【问题讨论】:
标签: php xml apache-flex json
我会选择 JSON。我们为 Flash Player 添加了原生 JSON 支持,因此它在解析方面的速度与 XML 一样快,而且更简洁/更小。
=Ryan ryan@adobe.com
【讨论】:
JSON 不是 Flex 的原生结构(很奇怪,是吗?您会认为 {} 对象可以很容易地序列化,但实际上并非如此),XML 是。这意味着 XML 是由虚拟机在幕后完成的,而 JSON 字符串被解析并通过字符串操作转换为对象(即使您使用的是 AS3CoreLib)......严重......就个人而言,我也看到了不一致在 JSONEncoder 中(在某一时刻,数组只是数字索引的对象)。
一旦将数据转换为 AS3 对象,在 XML 中搜索和解析数据仍然比使用对象更快。 XPath 表达式使数据遍历成为一种乐趣(与其他事物相比,几乎很容易让您微笑)。
另一方面,JS 在解析 JSON 方面要好得多。好多了,好多了。但是,既然迁移到 JavaScript 是“也许……有一天……”,那么您可能需要考虑,“将来使用 JSON 是否值得现在对性能造成影响?”
但这里有个问题,为什么不简单地有两个输出呢?由于 JS 和 AS 都可以为您提供几乎任意数量的变量的 POST,因此您实际上只需要关心服务器如何发送数据而不是接收它。以下是处理此问题的潜在方法:
// as you are about to output:
$type = './outputs/' . $_GET[ 'type' ] . '.php';
if( file_exists( $type ) && strpos( $type, '.', 1 ) === FALSE )
{
include( $type );
echo output_data( $data );
}
else
{
// add a 404 if you like
die();
}
那么,当得到 $_GET['type'] == 'js' 时,js.php 将是:
function output_data( $data ){ return json_encode( $data ); }
当得到 $_GET['type'] == 'xml' 时,xml.php 将保存一些内容,其中 output_data 返回一个表示 XML 的字符串(大量示例 here)
当然,如果您使用的是框架,那么您可以只使用视图执行类似的操作(我的建议归结为“您应该有两个不同的视图并使用 MVC”)。
【讨论】:
不,当它们的结构完全相同时,JSON 总是比 XML 小。而且解析文本的成本几乎和目标文本的大小差不多。
因此,JSON 比 XML 更快,如果您计划在 javascript 端重用它们,请选择 JSON。
基准 JSON 与 XML: http://www.navioo.com/ajax/ajax_json_xml_Benchmarking.php
【讨论】:
如果您打算使用 Javascript,一定要使用 JSON。两者都有一个非常好的结构。
这取决于 Flex 解析 JSON 的能力,所以我会研究一下。你要传回多少数据?错误/成功消息?用户资料?这将包含什么样的数据?
是否需要标签上的属性?或者只是一个“结构”。如果它需要属性和类似的东西,并且您不想深入到“类似数组”的结构中,请使用 XML。
如果您只想拥有 key => 值,甚至是多维的......请使用 JSON。
一切都取决于您要来回传递的数据类型。这将为您做出决定:)
【讨论】:
下载时间:
JSON 更快。
Javascript 解析
JSON 更快
Actionscript 解析
XML 更快。
Actionscript 中的高级使用
XML 更适合所有 E4X 功能。 JSON 受到限制,不了解向量,这意味着您仅限于数组,或者需要使用诸如
之类的东西覆盖 ascorelib 中的 JSON 编码器else if ( value is Vector.<*> ) {
// converts the vector to an array and
return arrayToString( vectorToArray( value ) );
} else if ( value is Object && value != null ) {
private function vectorToArray(__vector:Object):Array {
var __return : Array;
var __vList : Vector.<*>;
__return = new Array;
if ( !__vector || !(__vector is Vector.<*>) )
{
return __return;
}
for each ( var __obj:* in (__vector as Vector.<*>) )
{
__return.push(__obj);
}
return __return;
}
但恐怕将这些值返回到 Vectors 中并不那么好。我必须创建一个专门的实用程序类。
所以哪一个完全取决于您要移动的对象的高级程度。更高级的,使用 XML 以使其更容易在 ActionScript 方面。 简单的东西去 JSON
【讨论】: