簡體   English   中英

JSON 數組使用 appcelerator/titanium 返回空

[英]JSON array returns empty using appcelerator/titanium

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

我在應用程序中有一個單獨的選項卡,可以毫無問題地從 twitter 解析 JSON,但是無論我做什么,我都無法讓 appcelerator 解析我生成的 Z466DEEC76ECDF5FCA6D38571F6324D54。

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 只是以 [] 的形式返回 - 就是這樣。 沒有其他的。 I've inspected the structure of my JSON and the JSON that the twitter API returns, and both seem to be layed out pretty much the same, only the twitter API is coming back with a lot more info as you can imagine.

以下是我嘗試過的步驟:

  1. 我將 PHP 生成的 JSON 保存到一個名為“test.json”的文本文件中,並嘗試解析它。這很好用!

  2. 以前我正在編寫的 web 服務需要 an?action=played 查詢字符串。 我刪除了它以確保我肯定檢索到 JSON 數組。 這沒什么區別

  3. 我已經在 PHP 中為 text/plain 和 application/json 發送了標題,但無濟於事

  4. Finally, I have employed mod_rewrite on my server so I can serve the output from the web service as a json file.. Ie played.json -- Still, an empty array.

我只是覺得我反復用頭撞磚牆,並希望從一些壓力較小的人那里得到一些見解:)

任何幫助將不勝感激!

親切的問候,

戴夫

更多信息:通過檢查 http 標頭,我發現返回的內容長度始終為 2。但是,在瀏覽器中查看頁面或生成的.json 文件顯示完整的 Z0ECD11C1D7A287401D148A2DF8 數組。

如前所述,這似乎歸結為與 PHP 相關的問題。 腳本的工作方式很簡單。 它查詢 MySQL 表以檢索歌曲列表。 當它遍歷數組時,它會填充一個名為 $songs 的數組

在function的最后,我簡單地使用:

echo json_encode($songs);

更多信息如果我刪除內容類型 header 並在瀏覽器中查看頁面,我會收到 JSON 數組。如果我然后將其復制並粘貼到我的 Z2FEC392304A5C23AC1738DA2284F 文件的末尾,則在關閉標簽之后,顯示粘貼。

謝謝大家的回答。

我進一步調查發現問題似乎在於我的 PHP 腳本創建 JSON 數組的方式。

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

但是,我認為問題可能在於我解析提供歌曲信息的 XML 提要的方式。 有趣的是,它做到了。 我之前在我的網站上使用的代碼運行良好,但 appcelerator 一點也不喜歡它。

因此,我獲取了 XML 提要並通過 simplexml_load_string() 運行它,並且能夠直接在 php 的 json_encode() function 中使用它。 BAM ..它奏效了。

感謝你們付出的時間,真的很感激!

戴夫

根據API 文檔,您只需稍微切換一下順序。

onload -“在調用 open 之前將其設置為 function 以在成功響應時調用 function”

Appcelerator Titanium 有很多隱藏的障礙:-(

試試下面的代碼,這正是我正在使用的。

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();

還要確保您使用的是最新的 Ti SDK 1.6.2 我在早期版本中遇到了類似的問題。 在運行此代碼之前(但在添加之后),刪除構建文件夾以強制 Ti 完全重建項目。

我會建議一些可能會提供一些額外見解的更改

這段代碼

loader.setTimeout(10000);

應該是這個

loader.setTimeout([10000]);

我還將向 httpClient 添加一個錯誤處理程序,以查看是否有更多有趣的數據從服務器返回

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM