2011-05-31 50 views
1

我正在使用Appcelerator的Titanium編寫iPhone應用程序。該應用程序的一個要求是能夠檢索最近播放的歌曲的JSON數組,並將其顯示在tableView中。使用Appcelerator/titanium JSON數組返回空

我在應用程序中有一個單獨的標籤,可以解析來自twitter的JSON沒有問題,但無論我做什麼,我都無法讓appcelerator來解析我生成的json。 JSON是由位於我的服務器上的PHP文件使用json_encode()生成的;

這是我的JSON:

[ 
    { 
     "title": "Cramp Pres. Sliders - Meteor" 
    }, 
    { 
     "title": "Progressiver pres. FineSky - Fine Sky" 
    }, 
    { 
     "title": "Armin Van Buuren #x26; DJ Shah feat. Chris Jones - Going Wrong (Alex M.O.R.P.H #x26; Woody Van Eyden Remix)" 
    }, 
    { 
     "title": "Bart Claessen - Hartseer" 
    }, 
    { 
     "title": "Will Holland feat. Jeza - Start Again (Juventa Remix)" 
    } 
] 

我與許多JSON驗證器只是可以肯定的檢查這一點,這確實是有效的。

這是我的JS:

var loader = Ti.Network.createHTTPClient(); 
loader.setTimeout(10000); 

loader.open("GET","http://myurl.com/service/played.json"); 

loader.onload = function() 
{ 
    // Ti.API.info writes information to the debug console. 
    Titanium.API.info('Loaded! Status: ' + this.status); 
    Titanium.API.info('Response Header: ' + this.getResponseHeader('Content-Type')); 
    Titanium.API.info('Response Text: ' + this.responseText); 
} 

loader.send(); 

在應用雖然,responseText的僅僅是回來爲[] - 這就是它。沒有其他的。我檢查了我的JSON結構和twitter API返回的JSON結構,並且兩者看起來都差不多,只有twitter API纔會回來,並且可以想象得到更多信息。

下面是我曾嘗試以下步驟:

  1. 我救了PHP產生JSON到一個名爲「test.json」的文本文件,並試圖解析它。這工作得很好!

  2. 以前我寫的web服務需要一個?action =播放的查詢字符串。我刪除了這一點,以確保我確實正在檢索一個JSON數組。這並沒有區別

  3. 我已經發送了頭在PHP中的文本/純和應用/ JSON無濟於事

  4. 最後,我已經使用了mod_rewrite我的服務器上,以便我可以用於從Web服務的輸出作爲json文件..也就是說played.json - 仍然是一個空陣列。

我只是覺得我反覆敲打我的頭撞牆,並希望從一些不太強調人的一些見解:)

任何幫助將不勝感激!

親切的問候,

戴夫

更多信息: 我已經通過檢查HTTP頭返回的內容長度始終是2。然而,在查看網頁在瀏覽器中發現的,或生成的.json文件顯示完整的JSON數組。

正如之前所懷疑的,這似乎正在成爲一個PHP相關的問題。腳本的工作方式很簡單。它查詢MySQL表以檢索歌曲列表。雖然它的循環遍歷數組它填充的陣列名爲$歌曲

在函數結束時,我簡單地使用:

echo json_encode($songs); 

甚至更​​多信息 如果我刪除的內容類型頭和在瀏覽器中查看頁面,我收到JSON數組..如果我複製並粘貼到我的PHP文件的末尾,在結束標記後顯示粘貼的數據。

回答

1

感謝大家的回答。

我已經進一步調查,發現問題似乎與我的PHP腳本創建JSON數組的方式不同。

雖然JSON驗證過,並且在瀏覽器和.json文件中都可見,但是由於某種原因,它並沒有被創建?真奇怪,我仍然無法理解它。

但是,我決定解決提供歌曲信息的XML提要的方式可能存在問題。有趣的是,它的確如此。我以前在我的網站上使用過的代碼完美無瑕,但加賽者不喜歡它的一點點。

因此,我使用XML feed並通過simplexml_load_string()運行它,並且能夠直接在php的json_encode()函數中使用它。 BAM ..它工作。

感謝您的時間你們放進去,真的很感激!

戴夫

0

根據API documentation你只需要切換一下訂單。

onload事件 - 「叫開之前將其設置爲一個功能造成功能在成功應對被稱爲」

Appcelerator的鈦具有萬噸這些隱性障礙的:-(

+0

嗨布賴恩,感謝您的答案。 - 這是我以前嘗試的另一個步驟,我忽略了提及,但它仍然不能解決問題。 :( – Dave 2011-05-31 16:47:01

0

嘗試下面的代碼,這是我使用的到底是什麼。

var xhr = Titanium.Network.createHTTPClient(); 

xhr.onload = function() { 
    try { 
    var returned = JSON.parse(this.responseText); 
    } catch (e) { 
    Ti.API.debug("Unable to parse JSON from: "+url); 
    } 

    Ti.API.debug(returned); 
}; 

xhr.open("GET", url, false); 
xhr.send(); 

還要確保使用最新的鈦SDK 1.6.2我與早期版本的類似問題,而你運行此代碼之前(但添加後),刪除生成文件夾以強制Ti完全重建項目。

+0

嗨Gcoop ..謝謝你的答案 - 仍然遇到完全相同的問題在這裏。try/catch沒有錯誤,但返回的變量爲空..我猜鈦不喜歡我的動態JSON文件。我正在使用1.6.2 SDK,並且我刪除了我的構建文件夾。我想這將歸結爲我的PHP或服務器配置問題。謝謝:) – Dave 2011-05-31 17:44:22

+0

你是否使用類似這樣的設置標頭 標題('Content-type:application/json; charset = utf-8'); 和 是否使用utf8_encode()編碼所有字符串; – Gcoop 2011-05-31 19:32:43

+0

是的,我正在使用它的頭,我使用utf8_encode()的所有字符串。 – Dave 2011-05-31 19:41:23

0

我會建議可能會提供一些額外的見解一些變化

這個代碼

loader.setTimeout(10000); 

應該是這個

loader.setTimeout([10000]); 

,我也想補充一個錯誤處理程序HttpClient的看看是否有更多有趣的數據從服務器返回

loader.onerror = function(e) { 
    Ti.API.error(e); 
} 
+0

嗨亞倫,感謝您的建議..更改setTimeout([10000])實際上會導致崩潰應用程序的異常。所以我改回來並添加了onerror函數,它不報告任何錯誤。謝謝。 – Dave 2011-05-31 17:33:47

+0

你在哪個平臺上?我會猜測它是android?並基於你所得到的所有迴應,這些都很好,我懷疑服務器上的錯誤是 – 2011-05-31 18:39:27

+0

不是,平臺是iOS。 - 我也懷疑服務器。我有一個突然的靈感來檢查HTTP標頭等。我可以看到微型JSON飼料和我之間唯一真正的區別是內容長度。 Twitter API正在帶回JSON數據的確切大小,因爲我一直在帶回Content-Length:3 - 我現在正在調查這條路徑。 – Dave 2011-05-31 18:42:53