【问题标题】:JSON array returns empty using appcelerator/titaniumJSON 数组使用 appcelerator/titanium 返回空
【发布时间】:2011-09-05 14:20:13
【问题描述】:

我目前正在使用 Appcelerator 的 Titanium 编写一个 iPhone 应用程序。该应用的要求之一是能够检索最近播放的歌曲的 JSON 数组,并将其显示在 tableView 中。

我在应用程序中有一个单独的选项卡,可以毫无问题地从 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=played 查询字符串。我删除了它以确保我确实在检索 JSON 数组。这没什么区别

  3. 我已经在 PHP 中发送了 text/plain 和 application/json 的标头,但无济于事

  4. 最后,我在我的服务器上使用了 mod_rewrite,因此我可以将 Web 服务的输出作为 json 文件提供。即play.json -- 仍然是一个空数组。

我只是觉得我的头反复撞在砖墙上,希望一些压力较小的人提供一些见解:)

任何帮助将不胜感激!

亲切的问候,

戴夫

更多信息: 我通过检查 http 标头发现返回的内容长度始终为 2。但是,在浏览器中查看页面或生成的 .json 文件会显示完整的 JSON 数组。

正如之前所怀疑的,现在这似乎归结为与 PHP 相关的问题。脚本的工作方式很简单。它查询 MySQL 表以检索歌曲列表。当它遍历数组时,它会填充一个名为 $songs 的数组

在函数的最后,我简单地使用:

echo json_encode($songs);

更多信息 如果我删除内容类型标题并在浏览器中查看页面,我会收到 JSON 数组。如果我然后将其复制并粘贴到我的 PHP 文件的末尾,在结束标记之后,我粘贴的数据是显示出来。

【问题讨论】:

    标签: php javascript json titanium appcelerator


    【解决方案1】:

    谢谢大家的回答。

    我进一步调查发现问题似乎在于我的 PHP 脚本创建 JSON 数组的方式。

    虽然 JSON 经过验证,并且在浏览器和我生成的 .json 文件中都可见,但由于某种原因它没有被创建?真的很奇怪,我仍然无法理解它。

    但是,我认为问题可能在于我解析提供歌曲信息的 XML 提要的方式。有趣的是,它做到了。我之前在我的网站上使用的代码,运行良好,但是 appcelerator 一点也不喜欢它。

    所以我获取了 XML 提要并通过 simplexml_load_string() 运行它,并且能够直接在 php 的 json_encode() 函数中使用它。 BAM.. 成功了。

    感谢你们付出的时间,真的很感激!

    戴夫

    【讨论】:

      【解决方案2】:

      我会建议一些可能会提供一些额外见解的更改

      这段代码

      loader.setTimeout(10000);
      

      应该是这样的

      loader.setTimeout([10000]);
      

      我还将向 httpClient 添加一个错误处理程序,以查看是否有更多有趣的数据从服务器返回

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

      【讨论】:

      • 嗨 Aaron,感谢您的建议。将 setTimeout 更改为 ([10000]) 实际上会导致应用程序崩溃的异常。所以我把它改回来并添加了onerror函数,它不报告任何错误。谢谢。
      • 你在哪个平台上?我猜是安卓?并且根据您收到的所有回复,这些回复都很棒,我怀疑错误出在服务器上
      • 不,平台是iOS。 - 我也怀疑服务器。我突然有了检查 HTTP 标头等的灵感。我能看到的 twitter JSON 提要和我的之间唯一真正的区别是 Content-Length。 twitter API 正在返回 JSON 数据的确切大小,而我的总是返回 Content-Length: 3 -- 我现在正在调查这条路径。
      【解决方案3】:

      试试下面的代码,这正是我正在使用的。

      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 我在早期版本中遇到了类似的问题。并且在运行这段代码之前(但在添加之后),删除 build 文件夹以强制 Ti 完全重建项目。

      【讨论】:

      • 嗨,Gcoop.. 感谢您的回答。 - 在这里仍然遇到完全相同的问题。 try/catch 没有出错,但是返回的 var 为空。我猜 Titan 不喜欢我的动态 JSON 文件。我正在使用 1.6.2 SDK,并且我删除了我的构建文件夹。我想这将归结为我的 PHP 或服务器配置问题.. 无论如何谢谢 :)
      • 你是不是用这样的东西来设置headers header('Content-type: application/json; charset=utf-8');您是否使用 utf8_encode() 对所有字符串进行编码;
      • 是的,我将它用于标题,并且我将 utf8_encode() 用于所有字符串。
      【解决方案4】:

      根据API documentation,您只需稍微切换一下顺序即可。

      onload - “在调用 open 之前将其设置为函数 以使函数在成功响应时被调用”

      Appcelerator Titanium 有很多这些隐藏的障碍 :-(

      【讨论】:

      • 嗨,布赖恩,感谢您的回答。 - 这是我之前尝试过但没有提及的另一个步骤,但它仍然不能解决问题。 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多