2011-07-18 54 views
1

我正在開發一個floorplanner Flex迷你應用程序。我只是想知道在生成PHP響應時,JSON或XML在性能方面是否更好。我目前正在傾向於JSON,因爲響應也可以重用於Javascript。我在其他地方讀過JSON比XML解析需要更長的時間,這是真的嗎?在Flex中處理XML與JSON數據的靈活性有什麼關係?XML或JSON響應PHP後端的Flex應用程序?

回答

2

JSON不是Flex的本地結構(奇怪,呵呵?你會認爲{}對象可以很容易地序列化,但不是真的),XML是。這意味着XML在虛擬機的幕後完成,而JSON字符串通過字符串操作被解析並轉化爲對象(即使您使用的是AS3CoreLib)......總之......我個人還看到了不一致在JSONEncoder中(在某一點上,數組只是數字索引的對象)。

將數據轉換爲AS3對象後,在XML中搜索和解析數據的速度仍然快於使用對象的速度。 XPath表達式使數據遍歷成爲一種樂趣(與其他事物相比,幾乎容易讓你微笑)。

另一方面,JS在解析JSON方面要好得多。好多了,好多了。但是,由於轉向JavaScript是「可能......有一天......」,那麼您可能會考慮「將來使用JSON值得目前的性能打擊嗎?」

但這裏有個問題,爲什麼不簡單地有兩個輸出?由於JS和AS都可以爲您提供幾乎任意數量的變量,您只需關心服務器如何發送未收到數據的數據。下面就來處理這個問題的潛在方法:

// 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 [ '型']時== 'JS',js.php是:

function output_data($data){ return json_encode($data); } 

當越來越$ _GET ['type'] =='xml',xml。PHP將持有的東西,其中output_data返回一個代表XML的字符串(大量的例子here

當然,如果你使用的是一個框架,那麼你可以做一個像這樣的視圖,而不是(我的建議沸騰直到「你應該有兩個不同的視圖並使用MVC」)。

+0

我目前正在傾向於您的策略。不過,我認爲XML和JSON解析都可以共享相同的「視圖」,因爲在這兩種情況下,檢索數據的邏輯是相同的,只有響應類型不同。但是,我將使用的數據只是平面圖上繪製的對象。因此,對於每個對象,它們只有像width,height,id和其他簡單的一維屬性的屬性,所以我認爲e4x的靈活性對我來說並不會有什麼好處,因爲這些屬性用於更復雜的數據集(糾正我if我錯了) – peter

+0

@Peter如果真的那麼簡單,那麼你可能會更好地使用JSON - 唯一一次JSON真正成爲AS3的問題是具有非常大的數據集。 – cwallenpoole

+0

以百萬記錄記錄的大型數據集?我的數據集不會超過一兩千條記錄。 – peter

0

如果你曾經打算使用JavaScript它與JSON肯定去。兩者都有一個非常好的結構。

這取決於Flex如何很好地解析JSON,所以我會研究它。你將傳回多少數據?錯誤/成功消息?用戶檔案?這將包含什麼樣的數據?

它是否需要標籤上的屬性?或者只是一個「結構」。如果它需要屬性和類似的東西,並且你不想深入到「數組」這樣的結構中,那麼請使用XML。

如果你只是有鍵=>值,甚至多維...去與JSON。

全部取決於您將要傳遞哪種數據。這將使你的決定:)

0

下載時間:

JSON更快。

的JavaScript解析

JSON更快

的Actionscript解析

XML更快。 ActionScript中

高級使用

XML是與所有的E4X功能更好。 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; 
} 

一些諸如覆蓋JSON編碼器在ascorelib但恐怕讓這些值迴向量不爲好看。我必須爲此專門製作一個實用課程。

所以哪一個都取決於你將要移動的對象的先進程度。更先進的方法是,使用XML來讓ActionScript更容易。 簡單的東西去JSON

3

我會去與JSON。我們已經爲Flash Player添加了原生JSON支持,所以它在解析端與XML一樣快,而且它的冗長/小得多。

= Ryan [email protected]